|
|
/*******************************************************************************
* * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: FLNFILE.CPP * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 10/13/1999 * * DESCRIPTION: Find the lowest numbered files in a given directory with a given * root filename. * *******************************************************************************/ #include "precomp.h"
#pragma hdrstop
#include "flnfile.h"
///////////////////////////////
// DoesFileExist
//
bool NumberedFileName::DoesFileExist(LPCTSTR pszFileName) { DWORD dwFileAttr = 0; DWORD dwError = 0;
dwFileAttr = GetFileAttributes(pszFileName);
if (dwFileAttr == 0xFFFFFFFF) { // file not found
dwError = GetLastError(); return false; } if (dwFileAttr & FILE_ATTRIBUTE_DIRECTORY) { //
// file name is a directory
//
return false; } return true; }
///////////////////////////////
// ConstructFilename
//
bool NumberedFileName::ConstructFilename(LPTSTR pszFile, DWORD cchFile, LPCTSTR pszDirectory, LPCTSTR pszFilename, LPCTSTR pszNumber, LPCTSTR pszExtension ) { if ((pszFile == NULL) || (cchFile == 0)) { return false; }
CSimpleString FullFilePath;
*pszFile = TEXT('\0');
if (pszDirectory && *pszDirectory) { //
// Start with the directory name
//
FullFilePath += CSimpleString(pszDirectory);
//
// Ensure there is a trailing slash
//
if (!FullFilePath.MatchLastCharacter(TEXT('\\'))) { FullFilePath += CSimpleString(TEXT("\\")); } }
if (pszFilename && *pszFilename) { //
// Append the filename
//
FullFilePath += CSimpleString(pszFilename); }
if (pszNumber && *pszNumber) { //
// Append a space
//
FullFilePath += CSimpleString(TEXT(" "));
//
// Append the number to the file name
//
FullFilePath += CSimpleString(pszNumber);
}
if (pszExtension && *pszExtension) { //
// Append the extension's . if necessary
//
if (*pszExtension != TEXT('.')) { FullFilePath += CSimpleString(TEXT(".")); }
//
// Append the extension
//
FullFilePath += CSimpleString(pszExtension); }
if ((pszFile) && (cchFile > 0)) { _tcsncpy(pszFile, CSimpleStringConvert::NaturalString(FullFilePath).String(), cchFile - 1);
pszFile[cchFile - 1] = '\0'; }
return(lstrlen(pszFile) != 0); }
///////////////////////////////
// FindLowestAvailableFileSequence
//
int NumberedFileName::FindLowestAvailableFileSequence(LPCTSTR pszDirectory, LPCTSTR pszFilename, LPCTSTR pszNumberFormat, LPCTSTR pszExtension, bool bAllowUnnumberedFile, int nCount, int nStart) { DBG_FN("NumberedFileName::FindLowestAvailableFileSequence");
if (!pszDirectory || !pszFilename || !pszNumberFormat || !nCount || !*pszDirectory || !*pszFilename || !*pszNumberFormat) { return -1; }
TCHAR szFile[MAX_PATH + 1] = {0};
if (nCount == 1 && bAllowUnnumberedFile) { if (ConstructFilename(szFile, sizeof(szFile) / sizeof(szFile[0]) - 1, pszDirectory, pszFilename, NULL, pszExtension)) { if (!DoesFileExist(szFile)) { // 0 is a special return value that says "Don't put a number on this file"
return 0; } } }
int i = nStart; //
// Make sure i is a valid number
//
if (i <= 0) { i = 1; }
while (i<0x7FFFFFFF) { //
// Assume we'll be able to store the sequence
//
bool bEnoughRoom = true;
for (int j = 0; j < nCount && bEnoughRoom; j++) { TCHAR szNumber[31 + 1] = {0};
_sntprintf(szNumber, sizeof(szNumber) / sizeof(szNumber[0]) - 1, pszNumberFormat, i + j);
if (ConstructFilename(szFile, sizeof(szFile) / sizeof(szFile[0]) - 1, pszDirectory, pszFilename, szNumber, pszExtension)) { if (DoesFileExist(szFile)) { //
// Didn't make it
//
bEnoughRoom = false;
//
// Skip this series. No need to start at the bottom.
//
i += j; } } }
//
// If we made it through, return the base number, otherwise increment by one
//
if (bEnoughRoom) { return i; } else { i++; } }
return -1; }
///////////////////////////////
// CreateNumberedFileName
//
bool NumberedFileName::CreateNumberedFileName(DWORD dwFlags, LPTSTR pszPathName, DWORD cchPathName, LPCTSTR pszDirectory, LPCTSTR pszFilename, LPCTSTR pszNumberFormat, LPCTSTR pszExtension, int nNumber ) { if (nNumber == 0) { return ConstructFilename(pszPathName, cchPathName, (dwFlags&FlagOmitDirectory) ? NULL : pszDirectory, pszFilename, NULL, (dwFlags&FlagOmitExtension) ? NULL : pszExtension); } else { TCHAR szNumber[31 + 1] = {0};
if (pszNumberFormat) { _sntprintf(szNumber, sizeof(szNumber)/sizeof(szNumber[0]) - 1, pszNumberFormat, nNumber);
//
// Paranoid: NULL terminate
//
szNumber[sizeof(szNumber)/sizeof(szNumber[0]) - 1] = '\0'; }
return ConstructFilename(pszPathName, cchPathName, (dwFlags & FlagOmitDirectory) ? NULL : pszDirectory, pszFilename, szNumber, (dwFlags & FlagOmitExtension) ? NULL : pszExtension); } }
///////////////////////////////
// GenerateLowestAvailableNumberedFileName
//
int NumberedFileName::GenerateLowestAvailableNumberedFileName(DWORD dwFlags, LPTSTR pszPathName, DWORD cchPathName, LPCTSTR pszDirectory, LPCTSTR pszFilename, LPCTSTR pszNumberFormat, LPCTSTR pszExtension, bool bAllowUnnumberedFile, int nStart ) { //
// -1 is an error. Default to failure
//
int nResult = -1;
//
// Find the lowest available file number
//
int nLowest = FindLowestAvailableFileSequence(pszDirectory, pszFilename, pszNumberFormat, pszExtension, bAllowUnnumberedFile, 1, nStart); if (nLowest >= 0) { //
// If we can create the filename, return the number of the file
//
if (CreateNumberedFileName(dwFlags, pszPathName, cchPathName, pszDirectory, pszFilename, pszNumberFormat, pszExtension, nLowest)) { //
// Return the file's number
//
nResult = nLowest; } }
return nResult; }
|