FindNextFile 在 64 位 Windows 上失败?
-
01-07-2019 - |
题
使用 C++Builder 2007,FindFirstFile 和 FindNextFile 函数似乎无法在 64 位版本的 Vista 和 XP 上找到某些文件。我的测试应用程序是 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.
我很困惑。这是什么原因呢?
布莱恩
解决方案
是否有重定向发生?参见Wow64DisableWow64FsRedirection的备注 http://msdn.microsoft.com/en-gb/library/aa365743.aspx
其他提示
我在 MSDN 上找到了这个:
如果您正在编写一个 32 位应用程序来列出目录中的所有文件,并且该应用程序可能在 64 位计算机上运行,则应在调用 FindFirstFile 之前调用 Wow64DisableWow64FsRedirection 函数,并在最后一次调用 FindNextFile 之后调用 Wow64RevertWow64FsRedirection。有关详细信息,请参阅文件系统重定向器。
因此我必须更新我的代码:-)
您确定它正在与 dir 命令查找同一目录吗?他们似乎没有任何共同的文件。
另外,这不是问题,但“所有文件”的正确通配符是 *
*.* 表示“所有文件至少带有一个 .在名字里”
编译的时候有警告吗?
你转了吗 全部 针对此特定测试的警告(因为它不起作用)?
确保首先解决警告。
示例代码没有问题。我有另一个用 Delphi 编写的应用程序也失败了。我想我根据克里斯关于重定向的回答找到了答案:http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx
知道了:
http://msdn.microsoft.com/en-gb/library/aa384187(VS.85).aspx
当 32 位应用程序从 64 位操作系统上的这些文件夹之一读取时:
%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
感谢克里斯的意见,这帮助我了解了发生了什么。
编辑:也谢谢路德维格:-)