【问题标题】:Enumerate files in directory with wildcard in C在C中使用通配符枚举目录中的文件
【发布时间】:2014-02-08 14:32:25
【问题描述】:

我使用这样的代码来枚举子目录着色器中的所有着色器文件:

HANDLE hFind;
WIN32_FIND_DATA FindFileData;
shader_counter = 1;
pclog("searching shader files \n");
hFind = FindFirstFile("shaders\\*.fx", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
    pclog("no shader files found \n");
}
else
{
    pclog("shader files found \n");
    while(hFind!=INVALID_HANDLE_VALUE)
    {
          pclog("Filename=%s\n",FindFileData.cFileName);
          hFind = FindNextFile(hFind, &FindFileData);
          shader_counter++;
    }
    pclog("Exit loop\n");
    FindClose(hFind);
    hFind = INVALID_HANDLE_VALUE;
}

但它只输出许多文件中的 3 个并崩溃。我做错了什么?

编辑,这是使用通配符枚举子目录的正确代码,也许有人会觉得它有用:

HANDLE hFind;
WIN32_FIND_DATA FindFileData;
BOOL found = TRUE;
hFind = FindFirstFile("shaders\\*.fx", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{ // directory/wildcard not found 
}
else
{
    while(found)
    {
          //printf("Filename=%s\n",FindFileData.cFileName);
          found = FindNextFile(hFind, &FindFileData);
    }
    FindClose(hFind);
    hFind = INVALID_HANDLE_VALUE;
}

【问题讨论】:

  • 请先使用调试器查找崩溃的确切位置。

标签: c file directory enumerate


【解决方案1】:

根据 Microsoft 文档,FindNextFile 的返回值与 FindFirstFile 的返回值不同。 FindNextFile 返回一个布尔值:

    ...
    BOOL found = TRUE;
    printf("shader files found \n");
    while (found)
    {
          printf("Filename=%s\n",FindFileData.cFileName);
          found = FindNextFile(hFind, &FindFileData);
          shader_counter++;
    }
    printf("Exit loop\n");
    FindClose(hFind);
    ...

(它必须是一个独立的值,否则您会将无效句柄传递给FindClose。)

【讨论】:

  • 非常感谢,很好的收获)我用你的答案编辑了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2022-12-17
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多