FindNextFile在64位Windows上失败?
使用C ++ Builder 2007,FindFirstFile和FindNextFile函数似乎无法在Vista和XP的64位版本上找到某些文件。我的测试应用程序是32位。
如果我使用它们遍历文件夹C:\ Windows \ System32 \ Drivers,尽管在命令提示符下发出dir命令时只有185个文件,但它们只能找到少量文件。使用相同的示例代码列出了在32位版本的XP上可以正常使用的所有文件。
这是一个小示例程序:
int main(int argc, char* argv[]) { HANDLE hFind; WIN32_FIND_DATA FindData; int ErrorCode; bool cont = true; cout << "FindFirst/Next demo." << endl << endl; hFind = FindFirstFile("*.*", &FindData); if(hFind == INVALID_HANDLE_VALUE) { ErrorCode = GetLastError(); if (ErrorCode == ERROR_FILE_NOT_FOUND) { cout << "There are no files matching that path/mask\n" << endl; } else { cout << "FindFirstFile() returned error code " << ErrorCode << endl; } cont = false; } else { cout << FindData.cFileName << endl; } if (cont) { while (FindNextFile(hFind, &FindData)) { cout << FindData.cFileName << endl; } ErrorCode = GetLastError(); if (ErrorCode == ERROR_NO_MORE_FILES) { cout << endl << "All files logged." << endl; } else { cout << "FindNextFile() returned error code " << ErrorCode << endl; } if (!FindClose(hFind)) { ErrorCode = GetLastError(); cout << "FindClose() returned error code " << ErrorCode << endl; } } return 0; }
在64位XP的C:\ Windows \ System32 \ Drivers文件夹中运行它会返回以下内容:
C:\WINDOWS\system32\drivers>t:\Project1.exe FindFirst/Next demo. . .. AsIO.sys ASUSHWIO.SYS hfile.txt raspti.zip stcp2v30.sys truecrypt.sys All files logged.
在同一系统上的dir命令返回以下内容:
C:\WINDOWS\system32\drivers>dir/p Volume in drive C has no label. Volume Serial Number is E8E1-0F1E Directory of C:\WINDOWS\system32\drivers 16-09-2008 23:12 <DIR> . 16-09-2008 23:12 <DIR> .. 17-02-2007 00:02 80.384 1394bus.sys 16-09-2008 23:12 9.453 a.txt 17-02-2007 00:02 322.560 acpi.sys 29-03-2006 14:00 18.432 acpiec.sys 24-03-2005 17:11 188.928 aec.sys 21-06-2008 15:07 291.840 afd.sys 29-03-2006 14:00 51.712 amdk8.sys 17-02-2007 00:03 111.104 arp1394.sys 08-05-2006 20:19 8.192 ASACPI.sys 29-03-2006 14:00 25.088 asyncmac.sys 17-02-2007 00:03 150.016 atapi.sys 17-02-2007 00:03 106.496 atmarpc.sys 29-03-2006 14:00 57.344 atmepvc.sys 17-02-2007 00:03 91.648 atmlane.sys 17-02-2007 00:03 569.856 atmuni.sys 24-03-2005 19:12 5.632 audstub.sys 29-03-2006 14:00 6.144 beep.sys Press any key to continue . . . etc.
我很困惑这是什么原因呢?
布赖恩
解决方案
我们确定它与dir命令位于同一目录中吗?他们似乎没有共同的文件。
另外,这不是问题,但是"所有文件"的正确通配符为*
*。*表示"名称中至少包含一个。的所有文件"
是否正在进行重定向?请参阅有关Wow64DisableWow64FsRedirection的说明http://msdn.microsoft.com/zh-CN/library/aa365743.aspx
编译时是否有任何警告?
我们是否为此特定测试打开了所有警告(因为它不起作用)?
确保首先解决警告。
示例代码没有问题。我也用Delphi编写了另一个失败的应用程序。我想我基于Kris关于重定向的答案找到了答案:
http://msdn.microsoft.com/zh-CN/library/aa364418(VS.85).aspx
我在MSDN上找到了这个:
如果我们正在编写一个32位应用程序以列出目录中的所有文件,并且该应用程序可能在64位计算机上运行,则应在最后一次调用FindNextFile之后先调用Wow64DisableWow64FsRedirection函数,然后再调用FindFirstFile和Wow64RevertWow64FsRedirection。有关更多信息,请参见文件系统重定向器。
这是链接
因此,我将不得不更新代码:-)
知道了:
http://msdn.microsoft.com/zh-CN/library/aa384187(VS.85).aspx
当32位应用程序从64位OS上的以下文件夹之一中读取时:
%windir%\system32\catroot %windir%\system32\catroot2 %windir%\system32\drivers\etc %windir%\system32\logfiles %windir%\system32\spool
Windows实际上列出了以下内容:
%windir%\SysWOW64\catroot %windir%\SysWOW64\catroot2 %windir%\SysWOW64\drivers\etc %windir%\SysWOW64\logfiles %windir%\SysWOW64\spool
感谢输入,克里斯(Kris),这有助于我了解发生了什么。
编辑:谢谢你也Ludvig :-)