FindNextFile eșuează pe Windows pe 64 de biți?

utilizând C ++ Builder 2007, funcțiile FindFirstFile și FindNextFile nu par să găsească unele fișiere pe versiunile pe 64 de biți ale Vista și XP. Cererea mea de testare este de 32 de biți.

Dacă le folosesc pentru a repeta în folderul C: \ Windows \ System32 \ Drivers, ele găsesc doar o mână de fișiere, deși există 185 când emite o comandă dir într-un prompt de comandă. Folosind același exemplu de cod listează toate fișierele fine pe o versiune pe 32 de biți a XP.

Iată un mic exemplu de program:

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

Rularea în folderul C: \ Windows \ System32 \ Drivers pe 64 de biți XP returnează acest lucru:

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.

O comandă dir pe același sistem returnează acest lucru:

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.

      Sunt nedumerit. Care este motivul pentru aceasta?

      Brian

0

6 răspunsuri

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
adăugat

Am înţeles:

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

Atunci când o aplicație pe 32 de biți se citește dintr-unul din aceste foldere pe un sistem de operare pe 64 de biți:

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

Windows afișează de fapt conținutul:

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

Vă mulțumim pentru contribuția dvs. Kris, care ma ajutat să aflu ce se întâmplă.

EDIT: Mulțumesc și lui Ludvig :-)

0
adăugat

Am gasit acest lucru pe MSDN:

Dacă scrieți o aplicație pe 32 de biți pentru a lista toate fișierele într-un director și aplicația poate fi rulată pe un computer pe 64 de biți, trebuie să apelați funcția Wow64DisableWow64FsRedirection înainte de a apela FindFirstFile și apelați Wow64RevertWow64FsRedirection după ultimul apel către FindNextFile . Pentru mai multe informații, consultați Redirectorul de fișiere.

Iată linkul

Va trebui să actualizez codul meu din cauza asta :-)

0
adăugat

Esti sigur ca se uita in acelasi director ca si comanda dir? Nu par să aibă dosare în comun.

De asemenea, aceasta nu este problema, dar cardul sălbatic corect pentru "toate fișierele" este *

*. * înseamnă "toate fișierele cu cel puțin unul în numele"

0
adăugat

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

0
adăugat
Listarea fișierelor în C: \ Windows \ System32 \ Drivers, dar obținerea fișierelor în C: \ Windows \ SysWOW64 \ Drivers :-)
adăugat autor JubbaJubba, sursa
Care sunt fișierele din C: \ Windows \ System64 \ Drivers?
adăugat autor Kris Kumler, sursa

Există vreo avertizare când compilați?

Ați activat avertismentele ALL pentru acest test (deoarece nu funcționează)?

Asigurați-vă mai întâi că ați rezolvat avertismentele.

0
adăugat