FindNextFile schlägt auf 64-Bit-Windows fehl?

Mit C ++ Builder 2007 scheinen die Funktionen FindFirstFile und FindNextFile einige Dateien in 64-Bit-Versionen von Vista und XP nicht zu finden. Meine Testanwendung ist 32-Bit.

Wenn ich sie benutze, um durch den Ordner C: \ Windows \ System32 \ Drivers zu iterieren, finden sie nur eine Handvoll Dateien, obwohl es 185 gibt, wenn ich einen Befehl dir in einer Eingabeaufforderung ausstelle. Wenn Sie den gleichen Beispielcode verwenden, werden alle Dateien in einer 32-Bit-Version von XP aufgelistet.

Hier ist ein kleines Beispielprogramm:

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

Wenn Sie es im Ordner C: \ Windows \ System32 \ Drivers unter 64-Bit-XP ausführen, wird Folgendes zurückgegeben:

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.

Ein Verzeichnisbefehl auf demselben System gibt Folgendes zurück:

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.

      Ich bin verwirrt. Was ist der Grund dafür?

      Brian

0
hinzugefügt bearbeitet
Ansichten: 64

6 Antworten

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
hinzugefügt

Ich habs:

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

Wenn eine 32-Bit-Anwendung von einem dieser Ordner auf einem 64-Bit-Betriebssystem liest:

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

Windows listet tatsächlich den Inhalt von:

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

Danke für deine Eingabe Kris, das hat mir geholfen, herauszufinden, was vor sich geht.

EDIT: Danke auch Ludvig :-)

0
hinzugefügt

Ich habe dies auf MSDN gefunden:

Wenn Sie eine 32-Bit-Anwendung schreiben, um alle Dateien in einem Verzeichnis aufzulisten, und die Anwendung möglicherweise auf einem 64-Bit-Computer ausgeführt wird, sollten Sie vor dem Aufruf von FindFirstFile die Funktion Wow64DisableWow64FsRedirection und nach dem letzten Aufruf von FindNextFile Wow64RevertWow64FsRedirection aufrufen . Weitere Informationen finden Sie unter Dateisystemumleitung.

Hier ist der Link

Ich muss meinen Code deswegen aktualisieren :-)

0
hinzugefügt

Sind Sie sicher, dass es im selben Verzeichnis wie der Befehl dir sucht? Sie scheinen keine gemeinsamen Dateien zu haben.

Auch das ist nicht das Problem, aber der korrekte Platzhalter für "alle Dateien" ist *

*. * bedeutet "alle Dateien mit mindestens einem. im Namen"

0
hinzugefügt

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

0
hinzugefügt
Ich listet die Dateien in C: \ Windows \ System32 \ Drivers auf, bekomme aber die Dateien in C: \ Windows \ SysWOW64 \ Drivers :-)
hinzugefügt der Autor JubbaJubba, Quelle
Was sind die Dateien in C: \ Windows \ System64 \ Drivers?
hinzugefügt der Autor Kris Kumler, Quelle

Gibt es Warnungen beim Kompilieren?

Haben Sie die ALLE Warnungen für diesen bestimmten Test aktiviert (da es nicht funktioniert)?

Stellen Sie sicher, dass Sie zuerst die Warnungen lösen.

0
hinzugefügt