1. 程式人生 > >C/C++遍歷Windows文件夾下的所有文件

C/C++遍歷Windows文件夾下的所有文件

pre invalid col filename 可能 遞歸 項目 != 一個

因為文件夾中往往包含文件和文件夾。想要遍歷所有的文件,必須遍歷文件夾中所有的文件夾。很顯然,這個描述滿足遞歸的兩個要素:(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文件夾下的所有文件