在上述代碼中
FindFirstFile第一個(gè)個(gè)參數(shù)需要一個(gè)路徑,但要寫*.*,表示從所有文件中找到的第一個(gè).但寫f:或者f:雙斜杠都返回?zé)o效句柄.
如果f:\\1.txt 則對(duì)特定文件進(jìn)行搜索,返回找到的第一個(gè)
找到的文件的文件結(jié)構(gòu)被記錄在WIN32_FIND_DATA結(jié)構(gòu)體里
FindNextFile第一個(gè)參數(shù)是FindFirstFile的返回值,可以接著上次結(jié)果繼續(xù)尋找
但注意!!!!
但一個(gè)目錄的文件被搜索一遍后,FindNextFile返回的WIN32_FIND_DATA結(jié)構(gòu)體將重復(fù)找到最后一個(gè)找到的文件,而不會(huì)終止.
讓循環(huán)結(jié)束的方法就是找上一次的報(bào)錯(cuò)碼,然后看有沒(méi)有ERROR_NO_MORE_FILES信息發(fā)生.
hFile的有效與否個(gè)人覺(jué)得還是取決于第一次的FindFirstFile結(jié)果,本程序后半段的運(yùn)行主要還是errorcode!=ERROR_NO_MORE_FILES在控制.
使用FindFirstFile和FindNextFile查找某個(gè)目錄下的所有文件(包括子目錄)
一、在不使用mfc的程序中獲得某個(gè)目錄下的所有文件名稱,包括子目錄。把文件名稱以一個(gè)固定的程度放入一個(gè)緩沖中,這個(gè)緩沖要足夠的大,能容下所有的文件名稱。
函數(shù)的輸入為要查找的根目錄,輸出為存放所有文件名稱的緩沖
算法:使用遞歸
二、代碼:
void FindFileInDir(char* rootDir, char* strRet)
{
char fname[MAC_FILENAMELENOPATH];
ZeroMemory(fname, MAC_FILENAMELENOPATH);
WIN32_FIND_DA
ZeroMemory(&fd, sizeof(WIN32_FIND_DA
HANDLE hSearch;
char filePathName[256];
char tmpPath[256];
ZeroMemory(filePathName, 256);
ZeroMemory(tmpPath, 256);
strcpy(filePathName, rootDir);
BOOL bSearchFinished = FALSE;
if( filePathName[strlen(filePathName) -1] != '\\' )
{
strcat(filePathName, "\\");
}
strcat(filePathName, "*");
hSearch = FindFirstFile(filePathName, &fd);
//Is directory
if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
{
strcpy(tmpPath, rootDir);
strcat(tmpPath, fd.cFileName);
FindFileInDir(tmpPath, strRet);
}
else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
{
sprintf(fname, "%-50.50s", fd.cFileName);
strcat(strRet + strRet[strlen(strRet)] , fname);
}
while( !bSearchFinished )
{
if( FindNextFile(hSearch, &fd) )
{
if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
{
strcpy(tmpPath, rootDir);
strcat(tmpPath, fd.cFileName);
FindFileInDir(tmpPath, strRet);
}
else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
{
sprintf(fname, "%-50.50s", fd.cFileName);
strcat(strRet + strRet[strlen(strRet)] , fname);
}
}
else
{
if( GetLastError() == ERROR_NO_MORE_FILES ) //Normal Finished
{
bSearchFinished = TRUE;
}
else
bSearchFinished = TRUE; //Terminate Search
}
}
FindClose(hSearch);
}
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/caimouse/archive/2007/10/25/1844006.aspx
Windows API一日一練(58)FindFirstFile和FindNextFile函數(shù) 收藏
在開(kāi)發(fā)軟件的過(guò)程里,經(jīng)常需要維護(hù)目錄里的數(shù)據(jù)。比如在開(kāi)發(fā)銀行的信用卡系統(tǒng)里,由于每天創(chuàng)建的LOG非常多,那么一個(gè)很大的硬盤,在6個(gè)月后,就占用了很多空間。這時(shí)就有這樣的一個(gè)需求,把所有超過(guò)6個(gè)月的LOG數(shù)據(jù)定期刪除掉。要實(shí)現(xiàn)這個(gè)功能就得遍歷整個(gè)目錄,把文件名稱和文件創(chuàng)建的時(shí)間都超過(guò)6個(gè)月時(shí)間的文件刪除掉。因此,就需使用到下面的API函數(shù)FindFirstFile和FindNextFile來(lái)實(shí)現(xiàn)這樣的功能,F(xiàn)indFirstFile函數(shù)是查找到目錄下的第一個(gè)文件或目錄,F(xiàn)indNextFile函數(shù)是查找下一文件或目錄。
函數(shù)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是下一個(gè)文件或目錄的句柄。
調(diào)用函數(shù)的例子如下:
#001 #pragma on
#002
#003 //
#004 //遍歷一個(gè)目錄的文件。
#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 //找到第一個(gè)文件。
#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 //返回當(dāng)前文件的屬性。
#053 const WIN32_FIND_DA
#054 {
#055 return m_FindFileData;
#056 }
#057
#058 protected:
#059 HANDLE m_hFind; //保存當(dāng)查找的位置句柄。
#060 bool m_bFound; //當(dāng)前查找是否成功。
#061 WIN32_FIND_DA
#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
聯(lián)系客服
微信登錄中...
請(qǐng)勿關(guān)閉此頁(yè)面