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

发布于 2024-11-02 04:41:29 字数 774 浏览 5 评论 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);
}

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

I'm trying to read all files in a directory. I have the following code:

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

The problem is that when I execute the code it results in an infinite loop. Also the output characters are strange, like "File ".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鲜血染红嫁衣 2024-11-09 04:41:29

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

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

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

I think you are not using chars and wide chars in a consequent way. You should either use functions with wide char and wchar_t type or vice versa. (But it was a compile error for me so it may depend on some kind of project settings as well.)

And your exit condition in the while loop is also wrong it should test for FindNextFile and not !FindNextFile. The infinite loop may be because of this condition as if it doesn't find any files it will run forever.

Also you should test for the return value of FindFirstFile and not go into the loop if it doesn't find any files.

嗫嚅 2024-11-09 04:41:29

您正在调用 !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);

}

You are calling !FindNextFile instead of FindNextFile, also you are not checking why
the FindNextFile fails, so you can't be sure if all the files were processed.
Use something like this.

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

}
鹊巢 2024-11-09 04:41:29

你不能像下面这样使用.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++中对每个示例使用相同的。希望这有帮助。

Can't you just use .Net like below:

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

This is a c# example but you can use for each in C++ the same. Hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文