Domanda

utilizzando C++Builder 2007, le funzioni FindFirstFile e FindNextFile non sembrano essere in grado di trovare alcuni file nelle versioni a 64 bit di Vista e XP.La mia applicazione di prova è a 32 bit.

Se li uso per scorrere la cartella C:\Windows\System32\Drivers trovano solo una manciata di file anche se ce ne sono 185 quando eseguo un comando dir in un prompt dei comandi.Utilizzando lo stesso codice di esempio vengono elencati tutti i file correttamente su una versione a 32 bit di XP.

Ecco un piccolo programma di esempio:

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

Eseguendolo nella cartella C:\Windows\System32\Drivers su XP a 64 bit restituisce questo:

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.

Un comando dir sullo stesso sistema restituisce questo:

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.

Sono perplesso.Qual è la ragione di ciò?

Brian

È stato utile?

Soluzione

È in corso un reindirizzamento?Vedi i commenti su Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

Altri suggerimenti

Su MSDN ho trovato questo:

Se stai scrivendo un'applicazione a 32 bit per elencare tutti i file in una directory e l'applicazione può essere eseguita su un computer a 64 bit, devi chiamare la funzione Wow64DisableWow64FsRedirection prima di chiamare FindFirstFile e chiamare Wow64RevertWow64FsRedirection dopo l'ultima chiamata a FindNextFile.Per ulteriori informazioni, vedere Reindirizzamento del file system.

Ecco il collegamento

Dovrò aggiornare il mio codice per questo motivo :-)

Sei sicuro che stia cercando nella stessa directory del comando dir?Sembra che non abbiano alcun file in comune.

Inoltre, non è questo il problema, ma il carattere jolly corretto per "tutti i file" è *

*.* significa "tutti i file con almeno un file .nel nome"

Ci sono avvisi durante la compilazione?

Ti sei trasformato TUTTO avvertenze per questo particolare test (poiché non funziona)?

Assicurati prima di risolvere gli avvertimenti.

Non ci sono problemi con il codice di esempio.Ho anche un'altra applicazione che fallisce, scritta in Delphi.Penso di aver trovato la risposta in base alla risposta di Kris sul reindirizzamento:http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

Fatto:

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

Quando un'applicazione a 32 bit legge da una di queste cartelle su un sistema operativo a 64 bit:

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

Windows effettivamente elenca il contenuto di:

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

Grazie per il tuo contributo Kris, che mi ha aiutato a scoprire cosa sta succedendo.

MODIFICARE:Grazie anche a te, Ludwig :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top