此代码在家中的Windows XP上工作,但在64位Windows 7上工作失败。即使在提供的文件夹中有超过50个文件,循环也不会input一次。 它不仅不input,而且还为GetLastError
返回ERROR_NO_MORE_FILES
。 为什么?
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\\*";
为了列出目录中的文件。 否则,你只是要求有关目录本身的信息。
至少这就是我如何阅读FindFirstFile的文档
要检查不是根目录的目录,请使用该目录的路径,而不要使用尾部的反斜杠。 例如,“C:\ Windows”参数返回有关目录“C:\ Windows”的信息,而不是“C:\ Windows”中的目录或文件。 要检查“C:\ Windows”中的文件和目录,请使用“C:\ Windows *”的lpFileName。
我不知道为什么它在XP上为你工作
这个代码在许多方面是不正确的。
您必须检查FindFirstFile
的返回值。 如果调用FindFirstFile
成功,那么你已经有了ffd
的第一个文件。 当你的代码站立,你扔掉了第一个文件。 所以你需要重新调整你的循环逻辑来解决这个问题。 当然,如果GetLastError
返回ERROR_NO_MORE_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)); }