为什么FindNextFile在Windows 7上失败

为什么FindNextFile在Windows 7上失败,windows,winapi,Windows,Winapi,此代码在家中的Windows XP上工作,但在64位Windows 7上工作时失败。即使提供的文件夹中有50多个文件,循环也不会被输入一次。它不仅不输入,而且还返回GetLastError的ERROR\u NO\u MORE\u文件。为什么? string dir = "d:\\validfolder"; WIN32_FIND_DATA ffd; HANDLE h = FindFirstFile(dir.c_str(), &ffd); while(FindNextFile(h, &

此代码在家中的Windows XP上工作,但在64位Windows 7上工作时失败。即使提供的文件夹中有50多个文件,循环也不会被输入一次。它不仅不输入,而且还返回
GetLastError
ERROR\u NO\u MORE\u文件
。为什么?

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
,但没有效果。

您需要在目录中添加一个文件通配符:

string dir = "d:\\validfolder\\*";
让它列出目录中的文件。否则,您只需要询问有关目录本身的信息

至少我是这样阅读文档的

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


我不知道为什么它在XP上对您有效这段代码在很多方面都是不正确的

您必须检查
FindFirstFile
的返回值。如果对
FindFirstFile
的调用成功,那么您已经拥有
ffd
中的第一个文件。当您的代码保持不变时,您将丢弃第一个文件。所以你需要重新调整你的循环逻辑来解释这一点。当然,如果
GetLastError
返回
ERROR\u NO\u MORE\u FILES
,则表示搜索已耗尽所有文件

因此,可能发生的情况是,您需要与搜索字符串
“d:\\validfolder”
匹配的第一个文件。在调用
FindFirstFile
之后,这将在
ffd
中返回。然后忽略该信息并要求进行下一次匹配。但是没有后续匹配,因为只有一个对象匹配
“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));
}
string dir=“d:\\validfolder\\\*”;
WIN32_查找_数据ffd;
handleh=FindFirstFile(dir.c_str(),&ffd);
BOOL success=hINVALID\u HANDLE\u值;
while(成功)
{
//用ffd做点什么
success=FindNextFile(h,&ffd));
}

为什么目录名中有三个\项?啊,当我添加双斜杠时,预览显示的是单斜杠,所以我对此进行了补偿。我想我没有把它格式化好。实际代码中只有两个斜杠。不清楚为什么要丢弃第一个结果,即FindFirstFile返回的结果。错误代码在其他方面是完全正常的,这就是为什么你知道没有更多的文件,并且你已经看到了所有的文件。@HansPassant我现在知道了,谢谢。这很奇怪。我很确定我没有在XP上使用通配符。我得再检查一下。无论如何,这是有效的。谢谢。这是因为没有使用外卡。就代码而言,我只是裁剪了它并粘贴了绝对相关的部分。我不明白你的意思。如果您按照问题中的代码编写循环,那么您将错过第一次命中。你应该像上面那样写循环。或者你的意思是你的真实代码与问题中的代码不同。我们只能对问题中的代码进行评论。