Windows API一日一練(58)FindFirstFile和FindNextFile函數
來源:互聯網
上載者:User
在開發軟體的過程裡,經常需要維護目錄裡的資料。比如在開發銀行的信用卡系統裡,由於每天建立的LOG非常多,那麼一個很大的硬碟,在6個月後,就佔用了很多空間。這時就有這樣的一個需求,把所有超過6個月的LOG資料定期刪除掉。要實現這個功能就得遍曆整個目錄,把檔案名稱和檔案建立的時間都超過6個月時間的檔案刪除掉。因此,就需使用到下面的API函數FindFirstFile和FindNextFile來實現這樣的功能,FindFirstFile函數是尋找到目錄下的第一個檔案或目錄,FindNextFile函數是尋找下一檔案或目錄。 函數FindFirstFile、FindNextFile和FindClose聲明如下: WINBASEAPI__outHANDLEWINAPIFindFirstFileA( __in LPCSTR lpFileName, __out LPWIN32_FIND_DATAA lpFindFileData );WINBASEAPI__outHANDLEWINAPIFindFirstFileW( __in LPCWSTR lpFileName, __out LPWIN32_FIND_DATAW lpFindFileData );#ifdef UNICODE#define FindFirstFile FindFirstFileW#else#define FindFirstFile FindFirstFileA#endif // !UNICODE WINBASEAPIBOOLWINAPIFindNextFileA( __in HANDLE hFindFile, __out LPWIN32_FIND_DATAA lpFindFileData );WINBASEAPIBOOLWINAPIFindNextFileW( __in HANDLE hFindFile, __out LPWIN32_FIND_DATAW lpFindFileData );#ifdef UNICODE#define FindNextFile FindNextFileW#else#define FindNextFile FindNextFileA#endif // !UNICODE WINBASEAPIBOOLWINAPIFindClose( __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