標籤:
#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="./test"; //這裡指定的是目錄
//string path;
//cout<<"請輸入檔案萬用字元:"<<flush;
//cin>>path;
// str=str+path;
find((char*)str.c_str());//可以處理".",".." 不可以處理"*","..//*"
//_find(str);//可以處理"*","..//*" 不可以處理".",".."
system("pause");
}
複製代碼
其中有個結構體,它是C++內建的,是這樣的:
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;
Win32下C++遍曆目錄和檔案的源碼