11

使用 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.

我很困惑。这是什么原因?

布赖恩

4

6 回答 6

9

是否正在进行重定向?请参阅 Wow64DisableWow64FsRedirection 上的备注 http://msdn.microsoft.com/en-gb/library/aa365743.aspx

于 2008-09-18T19:28:05.250 回答
2

我在 MSDN 上找到了这个:

如果您正在编写一个 32 位应用程序来列出目录中的所有文件,并且该应用程序可能在 64 位计算机上运行,​​您应该在调用 FindFirstFile 之前调用 Wow64DisableWow64FsRedirection 函数,并在最后一次调用 FindNextFile 之后调用 Wow64RevertWow64FsRedirection 函数。有关详细信息,请参阅文件系统重定向器。

这是链接

因此,我将不得不更新我的代码:-)

于 2008-09-18T19:42:22.610 回答
1

知道了:

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 

感谢您的意见克里斯,这帮助我找出发生了什么。

编辑:也谢谢你 Ludvig :-)

于 2008-09-18T19:44:30.033 回答
0

您确定它与 dir 命令在同一目录中查找吗?他们似乎没有任何共同的文件。

此外,这不是问题,但“所有文件”的正确通配符是 *

*.* 表示“名称中至少有一个 . 的所有文件”

于 2008-09-18T19:25:53.027 回答
0

编译时有警告吗?

您是否为此特定测试打开了所有警告(因为它不起作用)?

确保首先解决警告。

于 2008-09-18T19:38:45.397 回答
0

示例代码没有问题。我还有另一个应用程序也失败了,它是用 Delphi 编写的。我想我根据 Kris 关于重定向的回答找到了答案:http: //msdn.microsoft.com/en-gb/library/aa364418 (VS.85).aspx

于 2008-09-18T19:40:55.127 回答