2008-09-18 192 views
10

使用C++ Builder 2007时,FindFirstFile和FindNextFile函数似乎无法在64位版本的Vista和XP上找到某些文件。我的测试应用程序是32位的。FindNextFile在64位Windows上失败?

如果我使用它们遍历文件夹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; 
} 

在C运行它:\ Windows \ System32下\驱动程序在64位XP夹返回此:

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. 

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

Brian

回答

0

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

而且,这不是问题,但正确的外卡“所有文件”,是*

*。*表示“至少有一个所有文件。在名为”

0

编译时是否存在任何警告?

你转过身吗全部关于这个特殊测试的警告(因为它不工作)?

确保首先解决警告。

2

,我发现这个MSDN上:

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

Here's the link

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

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 

感谢您的输入克里斯,帮助我找出是怎么回事。

编辑:谢谢路德维希太:-)