FindFirstFile不适用于Wild卡

时间:2011-10-06 12:23:27

标签: c++ c winapi

我正在尝试使用FindFirstFile函数遍历我的所有.txt文件,但是当我尝试它时出现INVALID_VALUE_HANDLE错误,这是我的函数:

int search(LPSTR lpszPath)
{
    WIN32_FIND_DATA WFD;
    HANDLE hSearch;
    CHAR szFilePath[MAX_PATH + 1];
    PathCombine(szFilePath, lpszPath, "*.txt");
    hSearch = FindFirstFile(szFilePath,&WFD);

    if(hSearch == INVALID_HANDLE_VALUE)
    {
        printf("Error Handle Value\n");
    }

    while (FindNextFile(hSearch,&WFD))
    {
        if(strcmp(WFD.cFileName,"..") && strcmp(WFD.cFileName,"."))
        {

            if(WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                PathCombine(szFilePath, lpszPath, WFD.cFileName);
                search(szFilePath);
            }
            else
            {
                PathCombine(szFilePath, lpszPath, WFD.cFileName);
                printf("%s\n",szFilePath);
        }
    }
}
 FindClose(hSearch);
 return 0;

我认为问题来自通配符,有什么建议吗?

3 个答案:

答案 0 :(得分:3)

我想问题是这只会找到与*.txt匹配的对象。您想要一个下降到目录的递归搜索。但它只会下降到与*.txt匹配的目录。

对于这样的递归搜索,您必须枚举所有没有*.txt通配符的目录。自己进行通配符测试可能更容易。

所以将代码更改为:

PathCombine(szFilePath, lpszPath, "*");

并单独测试每个文件的扩展名.txt

正如其他人所指出的那样,您无法检查找到的第一个文件。您必须将FindNextFile移动到循环的末尾。

答案 1 :(得分:1)

更正:抱歉,我只在unicode版本中使用过它。所以大卫是对的,它也适用于ANSI字符。在这种情况下,我的猜测是,您连接的路径无效。也许你没有正确地逃避反斜杠,例如“C:\测试\ * TXT”

问题不在于通配符,而是错误的字符类型。为了这样的东西,你需要使用宽字符串。

查看MSDN示例

答案 2 :(得分:1)

所以你打电话给FindFirstFile并且没有处理你再次为下一个文件调用FindNextFile的结果?我相信你也想要第一个结果。