2016-02-26 74 views
0

我想列出在驅動器C的所有文件,並寫了下面的功能:列出驅動器中的所有文件數量不等?

void Class_fileHandler::FindAllFiles(wstring FolderName) 
{ 
    WIN32_FIND_DATA findData; 
    wstring searchFolderName(FolderName); 

    searchFolderName.append(TEXT("\\*.*")); 
    HANDLE FirstFile = FindFirstFile(&searchFolderName[0], &findData); 

    while (FindNextFile(FirstFile, &findData)) 
    { 
     // Thanks to Collin Dauphinee 
     if (((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) /**&& (findData.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM)**/) 
     { 
      m_fileQueuer.push_back(findData.cFileName); 
     } 
     else if (wcscmp(findData.cFileName, TEXT(".")) && wcscmp(findData.cFileName, TEXT(".."))) 
     { 
      wstring NewPath = FolderName + TEXT("\\") + findData.cFileName; 
      FindAllFiles(NewPath); 
     } 
    } 
} 

void Class_fileHandler::testfunc() 
{ 
    WIN32_FIND_DATA findData; 
    for (int i = 0; i < m_driveLetters.size(); ++i) 
    { 
     // At the moment there is only C: 
     // So the function call is: 
     // FindAllFiles(TEXT("C:")) 
     FindAllFiles(m_driveLetters[i]); 
    } 

    wofstream file("C:\\tmp\\all_files.txt"); 

    for (unsigned int i = 0; i<m_fileQueuer.size(); i++) 
     file << m_fileQueuer[i] << endl; 
    file.close(); 

所有文件名被寫入C:\ tmp目錄\ all_files.txt。 此文件包含約168.000行/文件名。

當我選擇整個驅動器C:並點擊屬性時,它顯示580.000個文件。 enter image description here enter image description here

我做錯了什麼?

+2

您缺少第一個文件。你調用FindFirstFile然後你立即調用FindNextFile。改爲使用它:'FindFirstFile(); {...} while('FindNextFile');'---同時添加錯誤檢查並在完成時關閉句柄if if(FirstFile!= INVALID_HANDLE_VALUE){... FindClose(FirstFile);}' –

+0

謝謝,我也改善了! –

+1

你應該檢查爲什麼FindNextFile完成,如果它不是NO_MORE_FILES你跳過一個目錄,可能是由於權限。 GetLastError會告訴你。 –

回答

2

dwFileAttributes成員包含位標誌。您的代碼正在檢查目錄的屬性只有是否已設置了FILE_ATTRIBUTE_DIRECTORY位;它不會遍歷到有額外位設置的目錄,如FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEM

正確的檢查應該是((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY),它基本上拉出FILE_ATTRIBUTE_DIRECTORY位並檢查它是否設置。

+0

哦,謝謝!現在我得到190.000個文件。這是一個很大的錯誤,但仍然是爲數不多的文件。任何其他想法? –

+0

追加'*'而不是'*。*'到搜索路徑。您也可能沒有權限列出某些文件夾,但我相信它們會顯示在摘要中。 –

+0

*或\ *。\ *在這裏沒有區別。我相信這與權限有關。不管怎麼說,還是要謝謝你! –

相關問題