2008-09-18 213 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 

感謝您的輸入克里斯,幫助我找出是怎麼回事。

編輯:謝謝路德維希太:-)