因為文件夾中往往包含文件和文件夾。想要遍歷所有的文件,必須遍歷文件夾中所有的文件夾。很顯然,這個描述滿足遞歸的兩個要素:(1)問題的規模在不斷的縮小,且新問題的模式與舊問題相同。很顯然文件夾中含有子文件夾同樣需要遍歷。(2)含有簡單的終止條件,即遇到文件夾下再無文件夾停止。
C++遍歷文件夾下所有文件如下:
int osmgpxPaser::GetAllgpxFilepathFromfolder(char* Path) { char szFind[MAX_PATH]; WIN32_FIND_DATA FindFileData; strcpy(szFind,Path); strcat(szFind,"\\*.*"); HANDLE hFind=FindFirstFile(szFind,&FindFileData); if(INVALID_HANDLE_VALUE == hFind) return -1; do { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if(strcmp(FindFileData.cFileName,".")!=0 && strcmp(FindFileData.cFileName, "..")!=0) { //發現子目錄,遞歸之 char szFile[MAX_PATH] = {0}; strcpy(szFile,Path); strcat(szFile,"\\"); strcat(szFile,FindFileData.cFileName); GetAllgpxFilepathFromfolder(szFile); } } else { //找到文件,處理之 std::cout << lpPath << "\\" << FindFileData.cFileName << std::endl; } }while(FindNextFile(hFind,&FindFileData)); FindClose(hFind); return 0; }
這里不得不說一下FindFirstFile()函數。使用它必須引用windows.h頭文件,FindFirstFile第一個參數需要一個路徑,但要寫*.*,表示從所有文件中找到的第一個.第二個參數用於存儲文件信息,找到的文件的文件結構被記錄在WIN32_FIND_DATA結構體里。
另外,如果直接編譯以上代碼可能會出現以下錯誤: error C2664: “FindFirstFileW”: 不能將參數 1 從“char [261]”轉換為“LPCWSTR” ,解決方法為:
把工程設置里去掉UNICODE宏定義:項目->XXX屬性->配置屬性->常規->字符集 改為 “未設置” 就去掉了unicode支持,不過應該回報一個警告。
或在#include <windows.h>之前加上一句 #undef UNICODE