使用C中的通配符枚举目录中的文件

时间:2014-02-08 14:32:25

标签: c file directory enumerate

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

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

1 个答案:

答案 0 :(得分:0)

根据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。)