2011-04-20 72 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); 

}