为什么FindNextFile在Windows 7上失败

时间:2012-01-28 15:10:24

标签: windows winapi

此代码适用于家中的Windows XP,但在64位Windows 7上无法正常工作。尽管提供的文件夹中有超过50个文件,但循环仍未输入一次。它不仅没有输入,还会为ERROR_NO_MORE_FILES返回GetLastError。为什么呢?

string dir = "d:\\validfolder";
WIN32_FIND_DATA ffd;
HANDLE h = FindFirstFile(dir.c_str(), &ffd);
while(FindNextFile(h, &ffd))
{
// some operation
}
DWORD dw = GetLastError();// returns ERROR_NO_MORE_FILES

我尝试了Wow64DisableWow64FsRedirection,但这没有效果。

2 个答案:

答案 0 :(得分:7)

您需要向目录添加文件通配符:

string dir = "d:\\validfolder\\*";

用于列出目录中的文件。否则,您只需要询问有关目录本身的信息。

至少我是如何阅读FindFirstFile

的文档的
  

要检查不是根目录的目录,请使用路径to   该目录,没有尾部反斜杠。例如,一个论点   “C:\ Windows”返回有关目录“C:\ Windows”的信息,   不是关于“C:\ Windows”中的目录或文件。检查文件   和“C:\ Windows”中的目录,使用lpFileName“C:\ Windows *”。

我不知道为什么它在XP上为你工作

答案 1 :(得分:3)

此代码在许多方面都不正确。

您必须检查FindFirstFile的返回值。如果对FindFirstFile的调用成功,则您已在ffd中拥有第一个文件。当你的代码站立时,你扔掉了第一个文件。因此,您需要重新设置循环逻辑以解决这个问题。当然,如果GetLastError返回ERROR_NO_MORE_FILES,则表示搜索已耗尽所有文件。

所以,可能发生的事情是你要求匹配搜索字符串"d:\\validfolder"的第一个文件。调用ffd后,会在FindFirstFile中返回此消息。然后,您将忽略该信息并要求下一场比赛。但是没有后续匹配,因为只有一个对象匹配"d:\\validfolder",因为您的搜索模式中没有包含通配符。

此代码在XP上的行为与在Windows 7上的行为完全相同,我怀疑您在两个系统上都没有运行相同的代码。

如果要枚举文件夹的内容,则需要搜索"d:\\validfolder\\*"。像这样:

string dir = "d:\\validfolder\\*";
WIN32_FIND_DATA ffd;
HANDLE h = FindFirstFile(dir.c_str(), &ffd);
BOOL success = h<>INVALID_HANDLE_VALUE;
while(success)
{
    // do something with ffd
    success = FindNextFile(h, &ffd));
}