/****************************************************************************** * * Copyright (c) 2000 Microsoft Corporation * * Module Name: * findfile.cpp * * Abstract: * CFindFile functions. * * Revision History: * Brijesh Krishnaswami (brijeshk) 03/17/2000 * created * *****************************************************************************/ #include "precomp.h" #ifdef THIS_FILE #undef THIS_FILE #endif static char __szTraceSourceFile[] = __FILE__; #define THIS_FILE __szTraceSourceFile // constructor CFindFile::CFindFile() { m_ulCurID = 0; m_ulMaxID = 0; m_ulMinID = 0; m_fForward = FALSE; } // returns oldest/youngest file // n is older than n+1 BOOL CFindFile::_FindFirstFile( LPCWSTR pszPrefix, LPCWSTR pszSuffix, PWIN32_FIND_DATA pData, BOOL fForward, BOOL fSkipLast ) { BOOL fRc = FALSE; HANDLE hdl = INVALID_HANDLE_VALUE; ULONG ulCurID = 0; WCHAR szSrch[MAX_PATH]; TENTER("CFindFile::_FindFirstFile"); m_fForward = fForward; m_ulCurID = 1; m_ulMaxID = 0; m_ulMinID = 0xFFFFFFF7; if(NULL == pData || NULL == pszPrefix || NULL == pszSuffix) { SetLastError(ERROR_INVALID_PARAMETER); goto done; } // enumerate all files with wildcard search // record the first and last files in numerical order // then return in order requested wsprintf(szSrch, L"%s*%s", pszPrefix, pszSuffix); hdl = FindFirstFile(szSrch, pData); if(INVALID_HANDLE_VALUE == hdl) { goto done; } do { ulCurID = GetID(pData->cFileName); if (0 == ulCurID) // always skip 0 continue; if (ulCurID < m_ulMinID) m_ulMinID = ulCurID; if (ulCurID > m_ulMaxID) m_ulMaxID = ulCurID; } while (FindNextFile(hdl, pData)); FindClose(hdl); hdl = INVALID_HANDLE_VALUE; if (m_ulMaxID == 0) // no file really goto done; if (fSkipLast) // skip the last file if needed m_ulMaxID--; if (m_ulMaxID == 0) // no file again goto done; // start at beginning or end m_ulCurID = m_fForward ? m_ulMinID : m_ulMaxID; wsprintf(szSrch, L"%s%d%s", pszPrefix, m_ulCurID, pszSuffix); // get the first existing file while (m_ulCurID >= m_ulMinID && m_ulCurID <= m_ulMaxID && INVALID_HANDLE_VALUE == (hdl = FindFirstFile(szSrch, pData))) { // try again with leading zeros wsprintf(szSrch, L"%s%07d%s", pszPrefix, m_ulCurID, pszSuffix); if (INVALID_HANDLE_VALUE == (hdl = FindFirstFile (szSrch, pData))) { m_fForward ? m_ulCurID++ : m_ulCurID--; wsprintf(szSrch, L"%s%d%s", pszPrefix, m_ulCurID, pszSuffix); } else { break; } } if (INVALID_HANDLE_VALUE != hdl) { FindClose(hdl); fRc = TRUE; } done: TLEAVE(); return fRc; } // returns next/prev oldest file // n is older than n+1 BOOL CFindFile::_FindNextFile( LPCWSTR pszPrefix, LPCWSTR pszSuffix, PWIN32_FIND_DATA pData // [out] Next file info ) { BOOL fRc = FALSE; WCHAR szSrch[MAX_PATH]; HANDLE hdl = INVALID_HANDLE_VALUE; TENTER("CFindFile::_FindNextFile"); if(NULL == pData || NULL == pszPrefix || NULL == pszSuffix) { SetLastError(ERROR_INVALID_PARAMETER); goto done; } // get the next/prev oldest existing file do { m_fForward ? m_ulCurID++ : m_ulCurID--; wsprintf(szSrch, L"%s%d%s", pszPrefix, m_ulCurID, pszSuffix); if (m_ulCurID >= m_ulMinID && m_ulCurID <= m_ulMaxID && INVALID_HANDLE_VALUE == (hdl = FindFirstFile(szSrch, pData))) { // try again with leading zeros wsprintf(szSrch, L"%s%07d%s", pszPrefix, m_ulCurID, pszSuffix); } else if (INVALID_HANDLE_VALUE != hdl) break; } while (m_ulCurID >= m_ulMinID && m_ulCurID <= m_ulMaxID && INVALID_HANDLE_VALUE == (hdl = FindFirstFile(szSrch, pData))); if (INVALID_HANDLE_VALUE != hdl) // no more files? { fRc = TRUE; FindClose(hdl); } done: TLEAVE(); return fRc; } // returns n+1 for the max n for which file n exists ULONG CFindFile::GetNextFileID( LPCWSTR pszPrefix, LPCWSTR pszSuffix) { HANDLE hFile = INVALID_HANDLE_VALUE; CFindFile FindFile; WIN32_FIND_DATA FindData; TENTER("CFindFile::GetNextFileID"); // step thru all files in order of increasing id if (FindFile._FindFirstFile(pszPrefix, pszSuffix, &FindData, TRUE)) { while (FindFile._FindNextFile(pszPrefix, pszSuffix, &FindData)); } TLEAVE(); return FindFile.m_ulCurID; }