2011-04-20 74 views
0

我試圖讀取目錄中的所有文件。我有以下代碼:Visual C++的問題:讀取目錄中的所有文件

void scanDirectory(char* dir) 
{ 
    WIN32_FIND_DATA FindFileData; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 

    char DirSpec[MAX_PATH]; // directory specification 

    strcpy(DirSpec, dir); 
    strcat(DirSpec, "\\*"); 
    hFind = FindFirstFile(DirSpec, &FindFileData); 
    int i = 0; 
    do { 
     i++; 
     printf("%d \n", i); 
     if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 
      printf(" %s <DIR>\n", FindFileData.cFileName); 
     } 
     else 
     { 
      printf("File %s\n", FindFileData.cFileName); 
     } 

    } while(!FindNextFile(hFind, &FindFileData)); 

    FindClose(hFind); 
} 

問題是,當我執行代碼時,會導致無限循環。輸出字符也很奇怪,比如「File」。

+0

您可以發佈您正在獲取的輸出樣本 – Greenhorn 2011-04-20 09:42:50

+0

什麼是您傳遞的目錄路徑? – jfs 2011-04-20 10:13:22

+1

你應該真的在這個時代使用廣泛的API。 – rubenvb 2011-04-20 10:54:02

回答

-3

你就不能使用。NET象下面這樣:

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(Path); 
System.IO.FileInfo[] files = dir.GetFiles(); 
foreach (System.IO.FileInfo file in files) 
{ 
    // Do whatever you need with the file info... 
    string filename = file.Name; 
    string fullFilename = file.FullName; 
} 

這是一個C#示例,但你可以使用在每一個C++相同。希望這可以幫助。

+0

這不是OP詢問的問題。 – rubenvb 2011-04-20 10:53:36

+0

非託管C++中沒有.NET Framework。你不能調用這些函數,它們根本不可用。 – 2011-04-20 11:15:57

1

我認爲你不是以相應的方式使用字符和寬字符。你應該使用寬char和wchar_t類型的函數,反之亦然。 (但它對我來說是一個編譯錯誤,因此它可能取決於某種項目設置。)

而您在while循環中的退出條件也是錯誤的,它應該測試FindNextFile而不是!FindNextFile。無限循環可能是由於這種情況,如果它沒有找到任何文件,它將永遠運行。

此外,您應該測試FindFirstFile的返回值,如果沒有找到任何文件,請不要進入循環。

0

您正在調用FindNextFile而不是FindNextFile,同時您也不檢查爲什麼 FindNextFile失敗,因此您無法確定是否處理了所有文件。 使用這樣的東西。

WIN32_FIND_DATA stFindData; 
HANDLE hFind = FindFirstFile(cSearchPattern, &stFindData); 
if(hFind != INVALID_HANDLE_VALUE) 
{ 
    do 
    { 
    // Process File 

    } 
    while (FindNextFile(hFind, &stFindData) != 0); 

    DWORD dwError = GetLastError(); 
    if (dwError != ERROR_NO_MORE_FILES) 
    { 
    // Not All Files processed, deal with Error 
    } 

    FindClose(hFind); 

}