WIN32 C++ 遍歷資料夾
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
轉自:http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx
一、先介紹一個結構 WIN32_FIND_DATA
typedef struct _WIN32_FIND_DATA
{
DWORD dwFileAttributes; // 檔案屬性
FILETIME ftCreationTime; // 檔案建立時間
FILETIME ftLastAccessTime; // 檔案最後一次訪問時間
FILETIME ftLastWriteTime; // 檔案最後一次修改時間
DWORD nFileSizeHigh; // 檔案長度高 32 位
DWORD nFileSizeLow; // 檔案長度低 32 位
DWORD dwReserved0; // 系統保留
DWORD dwReserved1; // 系統保留
TCHAR cFileName[ MAX_PATH ]; // 長檔名
TCHAR cAlternateFileName[ 14 ]; // 檔案的可選名
} WIN32_FIND_DATA;
可以通過 FindFirstFile ()函式,根據檔案路徑把待操作檔案的相關屬性讀取到 WIN32_FIND_DATA 結構中去:
四、下面是遍歷程式碼
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
//只能處理目錄:lpPath只能是路徑
void find(char *lpPath)
{
char szFind[MAX_PATH];
char szFile[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"//*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,lpPath);
strcat(szFile,"//");
strcat(szFile,FindFileData.cFileName);
find(szFile);
}
}
else
{
cout<<FindFileData.cFileName<<endl;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}
//可同時處理目錄和檔案:path可以是路徑,也可以是檔名,或者檔案萬用字元
void _find(string path)
{
//取路徑名最後一個"//"之前的部分,包括"//"
string prefix=path.substr(0,path.find_last_of('//')+1);
WIN32_FIND_DATA FindFileData;
HANDLE hFind=::FindFirstFile(path.c_str(),&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
{
cout<<"檔案萬用字元錯誤"<<endl;
return;
}
while(TRUE)
{
//目錄
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//不是當前目錄,也不是父目錄
if(FindFileData.cFileName[0]!='.')
{
//查詢下一級目錄
_find(prefix+FindFileData.cFileName+'//'+"*.*");
}
}
//檔案
else
{
cout<<FindFileData.cFileName<<endl;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}
void main()
{
find("E:");//目錄:E盤
_find("E://*.*");//E盤下所有檔案
string str=".//";
string path;
cout<<"請輸入檔案萬用字元:"<<flush;
cin>>path;
str=str+path;
find((char*)str.c_str());//可以處理".",".." 不可以處理"*","..//*"
_find(str);//可以處理"*","..//*" 不可以處理".",".."
}
WIN32_FIND_DATA ffd;
HANDLE hFind = FindFirstFile("c://test.dat",&ffd);
二、函式 FindFirstFile
1 、宣告 : HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);
2 、引數 :
lpFileName String ,欲搜尋的檔名。可包含萬用字元,並可包含一個路徑或相對路徑名
lpFindFileData WIN32_FIND_DATA ,一個 WIN32_FIND_DATA 指標, 用於裝載與找到的檔案有關的資訊,該結構可用於後續的搜尋
3 、返回值 :
如執行成功,返回一個搜尋控制代碼。如果出錯,返回一個 INVALID_HANDLE_VALUE 常數,一旦不再需要,應該用 FindClose 函式關閉這個控制代碼
4 、功能
讀取檔案資訊到一個 WIN32_FIND_DATA 結構中,返回這個檔案的控制代碼
5 、註釋:
由這個函式返回的控制代碼可以作為一個引數用於 FindNextFile 函式。這樣一來,就可以方便的枚舉出與 lpFileName 引數指定的檔名相符的所有檔案(是指檔名含有萬用字元)
三、函式 FindNextFile
1 、宣告 BOOL FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);
2 、引數 :
HANDLE hFindFile 搜尋的檔案控制代碼,函式執行的時候搜尋的是此控制代碼的下一檔案
LPWIN32_FIND_DATA lpFindFileData 一個 WIN32_FIND_DATA 指標,
3 、返回值 :
如果呼叫成功返回一個非 0 值;呼叫失敗,返回為 0 ,可呼叫 GetLastError 來獲取錯誤資訊
4 、功能
繼續查詢 FindFirstFile 函式搜尋後的檔案
5 、註釋:
這個函式可以連續呼叫,以方便的枚舉出與 lpFileName 引數指定的檔名相符的所有檔案
其它參考文獻:http://www.cnblogs.com/summerRQ/articles/2375749.html