#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;