FindNextFile在64位Windows上失败?

使用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    
    . 16-09-2008 23:12
      .. 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.

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

      布赖恩

0

6 答案

There are no problems with the example code. I have another application that fails too, written in Delphi. I think I found the answer based on Kris' answer about redirection: http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

0
额外

得到它了:

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 

感谢您的输入Kris,帮助我了解发生了什么。

编辑:谢谢路德维格:-)

0
额外

我在MSDN上发现了这个:

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

这里是链接

因为这个,我必须更新我的代码:-)

0
额外

你确定它正在查看与dir命令相同的目录吗?他们似乎没有任何共同的文件。

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

*。*表示“所有文件中至少有一个。”

0
额外

Is there redirection going on? See the remarks on Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

0
额外
我列出了C:\ Windows \ System32 \ Drivers中的文件,但实际上获取了C:\ Windows \ SysWOW64 \ Drivers中的文件:-)
额外 作者 JubbaJubba,
C:\ Windows \ System64 \ Drivers中有哪些文件?
额外 作者 Kris Kumler,

编译时是否有警告?

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

确保首先解决警告。

0
额外