Frage

mit C ++ Builder 2007, die Findfirstfile und Findnextfile Funktionen scheinen nicht in der Lage sein, einige Dateien auf 64-Bit-Versionen von Vista und XP zu finden. Meine Testanwendung ist 32-Bit.

Wenn ich sie verwenden, um durchlaufen den Ordner C: \ Windows \ System32 \ Drivers sie nur eine Handvoll von Dateien zu finden, obwohl es 185 sind, wenn ich einen Befehl dir in einer Eingabeaufforderung ausgeben. Mit dem gleichen Beispiel Code listen alle Dateien in Ordnung auf einer 32-Bit-Version von XP.

Hier ist ein kleines Beispiel-Programm:

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

Beim Laufen sie in dem Verzeichnis C: \ Windows \ System32 \ Drivers-Ordner auf 64-Bit-XP gibt diese:

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 Befehl dir auf dem gleichen System gibt diese:

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.

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

Brian

War es hilfreich?

Lösung

Gibt es Umleitung los? Siehe Erläuterungen zu Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/ Bibliothek / aa365743.aspx

Andere Tipps

Ich fand dies auf MSDN:

Wenn Sie eine 32-Bit-Anwendung schreiben Sie alle Dateien in einem Verzeichnis aufgelistet und kann die Anwendung auf einem 64-Bit-Computer ausgeführt werden, sollten Sie die Wow64DisableWow64FsRedirectionfunction anrufen, bevor Findfirstfile und Anruf Wow64RevertWow64FsRedirection nach dem letzten rufen Findnextfile. Weitere Informationen finden Sie unter System Redirector-Datei.

Hier ist der Link

Ich muss meinen Code aktualisieren, da diese: -)

Sind Sie sicher, dass es im selben Verzeichnis wie das Kommando dir suchen? Sie scheinen keine Dateien gemeinsam zu haben.

Auch dies ist nicht das Problem, aber die richtige Wild Card für „alle Dateien“ ist *

*. * Bedeutet "alle Dateien mit mindestens einem. In dem Namen"

Gibt es irgendwelche Warnungen beim Kompilieren?

Haben Sie drehen Alle Warnungen auf diesen speziellen Test (da es funktioniert nicht)?

Achten Sie darauf, zuerst die Warnungen zu lösen.

Es gibt keine Probleme mit dem Beispielcode. Ich habe eine andere Anwendung, die zu reißen, in Delphi geschrieben. Ich glaube, ich fand die Antwort basierend auf Kris' Antwort über die Umleitung: http://msdn.microsoft.com/en-gb /library/aa364418(VS.85).aspx

Haben Sie es:

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

Wenn eine 32-Bit-Anwendung liest aus einem diesem Ordner auf einem 64-Bit-Betriebssystem:

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

Fenster listet tatsächlich den Inhalt:

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

Vielen Dank für Ihre Eingabe Kris, die mich herausfinden, geholfen, was los ist.

EDIT: Danke Ludvig zu: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top