Visual C ++的问题:读取目录中的所有文件

时间:2011-04-20 09:34:01

标签: c++ file-handling

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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);

}

答案 2 :(得分:-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 ++中使用相同的每个。希望这会有所帮助。