Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
5.0 KiB

/******************************************************************************
*
* 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
// <prefix>n<suffix> is older than <prefix>n+1<suffix>
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
// <prefix>n<suffix> is older than <prefix>n+1<suffix>
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 <Prefix>n<Suffix> 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;
}