windows下遍历文件夹
函数:
1 HANDLE WINAPI FindFirstFile( 2 _In_ LPCTSTR lpFileName, 3 _Out_ LPWIN32_FIND_DATA lpFindFileData 4 );
BOOL WINAPI FindNextFile(
_In_ HANDLE hFindFile,
_Out_ LPWIN32_FIND_DATA lpFindFileData
);
@ LPCTSTR与char *的转换
参考资料:TCHAR与char的互转
LPCTSTR会根据当前的字符集进行自适应:如果为ANSI,LPCTSTR = const char *;如果为Unicode,LPCTSTR = const wchar_t *;
但LPCTSTR = const wchar_t *时,需要使用WideCharToMultiByte() / MultiByteToWideChar()函数;
@ FindFirstFile()
由这个函数返回的句柄可以作为一个参数用于FindNextFile函数。这样一来,就可以方便的枚举出与lpFileName参数指定的文件名相符的所有文件。
@ 核心代码
1 void GetRawImagePath(TCHAR* folder, std::vector<TCHAR *> &image_path) 2 { 3 WIN32_FIND_DATA FindFileData; 4 HANDLE hFind; 5 TCHAR path[1000]; 6 lstrcpy(path, folder); 7 lstrcat(path, _T("\\")); 8 lstrcat(path, _T("*.*")); /**必须加*.*才能搜索文件夹下所有文件*/ 9 10 hFind = FindFirstFile(path, &FindFileData); 11 if (INVALID_HANDLE_VALUE == hFind) 12 { 13 std::cout << "FindFirstFile failed:" << GetLastError() << std::endl; 14 return; 15 } 16 17 18 do{ 19 if (FindFileData.cFileName[0] == '.') 20 continue; 21 22 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 23 { 24 std::cout << "directory" << std::endl; 25 TCHAR subpath[1000]; 26 lstrcpy(subpath, folder); 27 lstrcat(subpath, _T("\\")); 28 lstrcat(subpath, FindFileData.cFileName); 29 GetRawImagePath(subpath, image_path); 30 } 31 else 32 { 33 std::cout << "file" << std::endl; 34 TCHAR *path = new TCHAR[1000]; 35 lstrcpy(path, folder); 36 lstrcat(path, _T("\\")); 37 lstrcat(path, FindFileData.cFileName); 38 image_path.push_back(path); 39 } 40 41 } while (FindNextFile(hFind, &FindFileData)); 42 43 FindClose(hFind); 44 }