用FindFirstFile和FindNextFile遍历一个文件夹

来源:互联网 发布:网络直播公司简介 编辑:程序博客网 时间:2024/05/16 14:19

今天在给美术做工具删除冗余texture时,发现对于遍历文件夹的API很不熟悉,特此记录下2个比较常用的API。

WINDOWS下函数原型:

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 // !UNICODEWINBASEAPIBOOLWINAPIFindNextFileA(    __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

需要注意的地方是最先搜索到的会是"."和".."。第一个是当前目录,第二个是上一层目录。如果需要遍历文件,我们需要把这俩个目录过滤掉。一个遍历目录下所有文件的函数大致如下:

typedef std::vector< std::string> FileVec;FileVec fileList;void Findfile(const TCHAR* path, FileVec& filelist){TCHAR tmp[MAX_PATH];WIN32_FIND_DATA fileData;_tcscpy_s(tmp, MAX_PATH, path);_tcscat_s(tmp, MAX_PATH, _T("//*"));      // 通配所有文件HANDLE h = FindFirstFile(tmp, &fileData);if( h == INVALID_HANDLE_VALUE){// To do somethingreturn ;}while ( TRUE ){if( fileData.cFileName[0] != '.' ){// 不是当前路径和父路径的快捷方式if( fileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY ){// 如果该文件是一个普通目录// 如果要继续遍历该目录_tcscpy_s(tmp, MAX_PATH, path);  <span style="white-space:pre"></span>_tcscat_s(tmp, _T("/"));_tcscat_s(tmp, MAX_PATH, fileData.cFileName);       // 子目录路径Findfile(tmp, filelist);}filelist.push_back( std::string(fileData.cFileName) );}// 如果是当前目录,父目录快捷方式,或者是一个普通文件,继续寻找下一个文件if( 0 == FindNextFile(h, &fileData) ){break;}}}



0 0
原创粉丝点击