我正在尝试使用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;
我认为问题来自通配符,有什么建议吗?
答案 0 :(得分:3)
我想问题是这只会找到与*.txt
匹配的对象。您想要一个下降到目录的递归搜索。但它只会下降到与*.txt
匹配的目录。
对于这样的递归搜索,您必须枚举所有没有*.txt
通配符的目录。自己进行通配符测试可能更容易。
所以将代码更改为:
PathCombine(szFilePath, lpszPath, "*");
并单独测试每个文件的扩展名.txt
。
正如其他人所指出的那样,您无法检查找到的第一个文件。您必须将FindNextFile
移动到循环的末尾。
答案 1 :(得分:1)
更正:抱歉,我只在unicode版本中使用过它。所以大卫是对的,它也适用于ANSI字符。在这种情况下,我的猜测是,您连接的路径无效。也许你没有正确地逃避反斜杠,例如“C:\测试\ * TXT”
问题不在于通配符,而是错误的字符类型。为了这样的东西,你需要使用宽字符串。
查看MSDN示例
答案 2 :(得分:1)
所以你打电话给FindFirstFile
并且没有处理你再次为下一个文件调用FindNextFile
的结果?我相信你也想要第一个结果。