2008-09-18 36 views
10

sử dụng C++ Builder 2007, các hàm FindFirstFile và FindNextFile dường như không thể tìm thấy một số tệp trên các phiên bản Vista và XP 64 bit. Ứng dụng thử nghiệm của tôi là 32-bit.FindNextFile không hoạt động trên Windows 64 bit?

Nếu tôi sử dụng chúng để lặp qua thư mục C: \ Windows \ System32 \ Drivers, chúng chỉ tìm thấy một số tệp mặc dù có 185 khi tôi phát lệnh dir trong dấu nhắc lệnh. Sử dụng cùng một mã ví dụ liệt kê tất cả các tệp tin tốt trên phiên bản XP 32 bit.

Dưới đây là một chương trình ví dụ nhỏ:

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; 
} 

Chạy nó trong thư mục C: \ Windows \ System32 \ Drivers trên XP 64-bit trả về này:

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. 

Một lệnh dir trên cùng một hệ thống trả về điều này:

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. 

Tôi đang bối rối. Lý do cho điều này là gì?

Brian

Trả lời

9

Is có chuyển hướng đang diễn ra? Xem nhận xét trên Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

+0

Các tệp trong C: \ Windows \ System64 \ Drivers là gì? –

+0

Tôi liệt kê các tập tin trong C: \ Windows \ System32 \ Drivers nhưng thực sự nhận được các tập tin trong C: \ Windows \ SysWOW64 \ Drivers :-) – JubbaJubba

0

Bạn có chắc là nó đang tìm trong cùng thư mục với lệnh dir? Họ dường như không có bất kỳ tập tin nào chung.

Ngoài ra, đây không phải là vấn đề, nhưng thẻ hoang dã chính xác cho "tất cả các file" là *

*. * Có nghĩa là "tất cả các file có ít nhất một. Trong cái tên"

0

Có cảnh báo nào khi bạn biên dịch không?

Bạn đã bật TẤT CẢ cảnh báo về cho thử nghiệm cụ thể này (vì nó không hoạt động)?

Đảm bảo trước tiên phải giải quyết các cảnh báo.

2

Tôi thấy điều này trên MSDN:

Nếu bạn đang viết một ứng dụng 32-bit để liệt kê tất cả các tập tin trong một thư mục và ứng dụng có thể chạy trên máy tính 64 bit, bạn nên gọi hàm Wow64DisableWow64FsRedirectionfunction trước khi gọi hàm FindFirstFile và gọi Wow64RevertWow64FsRedirection sau cuộc gọi cuối cùng tới FindNextFile. Để biết thêm thông tin, xem File System Redirector.

Here's the link

tôi sẽ phải cập nhật mã của tôi vì :-) này

0

Got it:

http://msdn.microsoft.com/en-gb/library/aa384187(VS.85).aspx

Khi một ứng dụng 32-bit đọc từ một trong những các thư mục này trên hệ điều hành 64 bit:

%windir%\system32\catroot 
%windir%\system32\catroot2 
%windir%\system32\drivers\etc 
%windir%\system32\logfiles 
%windir%\system32\spool 

Windows thực sự liệt kê các nội dung của:

%windir%\SysWOW64\catroot 
%windir%\SysWOW64\catroot2 
%windir%\SysWOW64\drivers\etc 
%windir%\SysWOW64\logfiles 
%windir%\SysWOW64\spool 

Cảm ơn thông tin của bạn Kris, mà đã giúp tôi tìm hiểu những gì đang xảy ra.

EDIT: Cảm ơn bạn Ludvig quá :-)

Các vấn đề liên quan