標籤:目錄 檔案結構 direct 解決 unicode and tool from directory
因為檔案夾中往往包含檔案和檔案夾。想要遍曆所有的檔案,必須遍曆檔案夾中所有的檔案夾。很顯然,這個描述滿足遞迴的兩個要素:(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
C/C++遍曆Windows檔案夾下的所有檔案