此代码适用于家中的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
,但这没有效果。
答案 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));
}