0

我正在尝试读取目录中的所有文件。我有以下代码:

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);
}

问题是当我执行代码时会导致无限循环。输出字符也很奇怪,例如“文件”。

4

3 回答 3

1

我认为您没有以随后的方式使用字符和宽字符。您应该使用具有宽字符和 wchar_t 类型的函数,反之亦然。(但这对我来说是一个编译错误,所以它也可能取决于某种项目设置。)

而且你在 while 循环中的退出条件也是错误的,它应该测试FindNextFile而不是!FindNextFile。无限循环可能是因为这种情况,好像它找不到任何文件,它将永远运行。

此外,如果没有找到任何文件,您应该测试的返回值FindFirstFile并且不要进入循环。

于 2011-04-20T09:57:20.003 回答
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);

}
于 2011-04-20T10:29:33.703 回答
-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;
}

这是 ac# 示例,但您可以在 C++ 中使用相同的每个示例。希望这可以帮助。

于 2011-04-20T09:51:38.823 回答