Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FindFirstFile不使用通配符_C++_C_Winapi - Fatal编程技术网

C++ FindFirstFile不使用通配符

C++ FindFirstFile不使用通配符,c++,c,winapi,C++,C,Winapi,我试图使用FindFirstFile函数遍历我的所有.txt文件,但尝试时出现无效值\u句柄错误,以下是我的函数: int search(LPSTR lpszPath) { WIN32_FIND_DATA WFD; HANDLE hSearch; CHAR szFilePath[MAX_PATH + 1]; PathCombine(szFilePath, lpszPath, "*.txt"); hSearch = FindFirstFile(szFileP

我试图使用
FindFirstFile
函数遍历我的所有
.txt
文件,但尝试时出现
无效值\u句柄
错误,以下是我的函数:

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;

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

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

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

因此,将代码更改为:

PathCombine(szFilePath, lpszPath, "*");
并分别测试每个文件的扩展名
.txt


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

更正:抱歉,我只在unicode版本中使用了它。所以David是对的,它也适用于ANSI字符。在这种情况下,我的猜测是,连接的路径无效。可能您没有正确地避开反斜杠,例如“c:\test\*.txt”

问题不在于通配符,而在于错误的字符类型。为了实现类似的功能,您需要使用宽字符串


查看一个示例

因此您调用了
FindFirstFile
,并且没有处理结果,您正在为下一个文件再次调用
FindNextFile
?我相信您也希望得到第一个结果。

LPSZPATH的值是多少它的名称与此搜索类似(“L:\\Program Files”);所以它是L:\\Program files
GetLastError()
返回什么?它返回错误\u FILE\u NOT\u FOUND 2(0x2)。好吧,我确定你没有任何.txt文件存储在c:\Program files中。是的,我想要所有匹配*.txt的文件,那么我如何修复它?搜索匹配到
*
的文件,然后自己测试扩展名。您目前的问题是,唯一可以返回的目录必须匹配
*.txt
,我准备打赌完全为零。或者在每个目录中执行两次搜索。首先进行
*.txt
搜索以查找文本文件,然后进行
*
搜索以获取递归的子目录。(
FindExSearchLimitToDirectories
可能有助于第二次搜索。)@Raymond是的,这可能更有效。呃,这不是真的。ANSI版本的FindFirstFile工作正常。反斜杠由PathCombine设置。