FindFirstFile、FindNextFile和FindClose
在開發軟件的過程裏,經常需要維護目錄裏的數據。比如在開發銀行的信用卡系統裏,由於每天創建的LOG非常多,那麼一個很大的硬盤,在6個月後,就佔用了很多空間。這時就有這樣的一個需求,把所有超過6個月的LOG數據定期刪除掉。要實現這個功能就得遍歷整個目錄,把文件名稱和文件創建的時間都超過6個月時間的文件刪除掉。因此,就需使用到下面的API函數FindFirstFile和FindNextFile來實現這樣的功能,FindFirstFile函數是查找到目錄下的第一個文件或目錄,FindNextFile函數是查找下一文件或目錄。
函數FindFirstFile、FindNextFile和FindClose聲明如下:
WINBASEAPI
__out
HANDLE
WINAPI
FindFirstFileA(
__in LPCSTR lpFileName,
__out LPWIN32_FIND_DATAA lpFindFileData
);
WINBASEAPI
__out
HANDLE
WINAPI
FindFirstFileW(
__in LPCWSTR lpFileName,
__out LPWIN32_FIND_DATAW lpFindFileData
);
#ifdef UNICODE
#define FindFirstFile FindFirstFileW
#else
#define FindFirstFile FindFirstFileA
#endif // !UNICODE
WINBASEAPI
BOOL
WINAPI
FindNextFileA(
__in HANDLE hFindFile,
__out LPWIN32_FIND_DATAA lpFindFileData
);
WINBASEAPI
BOOL
WINAPI
FindNextFileW(
__in HANDLE hFindFile,
__out LPWIN32_FIND_DATAW lpFindFileData
);
#ifdef UNICODE
#define FindNextFile FindNextFileW
#else
#define FindNextFile FindNextFileA
#endif // !UNICODE
WINBASEAPI
BOOL
WINAPI
FindClose(
__inout HANDLE hFindFile
);
lpFileName是目錄名稱。一般使用通配符。
lpFindFileData是找到的文件或目錄屬性。
hFindFile是下一個文件或目錄的句柄。
調用函數的例子如下:
#001 #pragma once
#002
#003 //
#004 //遍歷一個目錄的文件。
#005 //蔡軍生 2007/10/25 QQ:9073204 深圳
#006 //
#007 class CFindFile
#008 {
#009 public:
#010
#011 CFindFile(void)
#012 {
#013 m_hFind = INVALID_HANDLE_VALUE;
#014 m_bFound = false;
#015 memset(&m_FindFileData,0,sizeof(m_FindFileData));
#016 }
#017
#018 ~CFindFile(void)
#019 {
#020 if (m_hFind != INVALID_HANDLE_VALUE)
#021 {
#022 ::FindClose(m_hFind);
#023 }
#024 }
#025
#026 //找到第一個文件。
#027 void First(LPCTSTR lpFileName)
#028 {
#029 m_hFind = ::FindFirstFile(lpFileName,&m_FindFileData);
#030 if (m_hFind != INVALID_HANDLE_VALUE)
#031 {
#032 m_bFound = true;
#033 }
#034 else
#035 {
#036 m_bFound = false;
#037 }
#038 }
#039
#040 //查找一下文件。
#041 void Next(void)
#042 {
#043 m_bFound = FindNextFile(m_hFind, &m_FindFileData) ? true:false;
#044 }
#045
#046 //是否可以查找一下文件。
#047 bool IsOK(void) const
#048 {
#049 return m_bFound;
#050 }
#051
#052 //返回當前文件的屬性。
#053 const WIN32_FIND_DATA& GetCurFile(void)
#054 {
#055 return m_FindFileData;
#056 }
#057
#058 protected:
#059 HANDLE m_hFind; //保存當查找的位置句柄。
#060 bool m_bFound; //當前查找是否成功。
#061 WIN32_FIND_DATA m_FindFileData;//保存當前文件的屬性。
#062
#063 };
#064
使用如下:
#001 //查找文件。
#002 CFindFile findDemo;
#003 for (findDemo.First(_T(".\\*"));
#004 findDemo.IsOK();
#005 findDemo.Next())
#006 {
#007 //
#008 OutputDebugString(findDemo.GetCurFile().cFileName);
#009 OutputDebugString(_T("\r\n"));
#010 }
#011
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.