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