Question

utilisant C ++ Builder 2007, les fonctions FindFirstFile et FindNextFile ne semblent pas être en mesure de trouver des fichiers sur les versions 64 bits de Vista et XP. Mon application de test est en 32 bits.

Si je les utilise pour parcourir le dossier C: \ Windows \ System32 \ Drivers, ils ne trouvent qu'une poignée de fichiers, bien qu'il y en ait 185 lorsque je lance une commande dir dans une invite de commande. En utilisant le même exemple de code, tous les fichiers d’une version 32 bits de XP sont répertoriés.

Voici un petit exemple de programme:

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

L'exécuter dans le dossier C: \ Windows \ System32 \ Drivers sous XP 64 bits renvoie ceci:

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.

Une commande dir sur le même système renvoie ceci:

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.

Je suis perplexe. Quelle en est la raison?

Brian

Était-ce utile?

La solution

Y a-t-il une redirection en cours? Voir les remarques sur Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/ bibliothèque / aa365743.aspx

Autres conseils

J'ai trouvé cela sur MSDN:

Si vous écrivez une application 32 bits pour répertorier tous les fichiers d'un répertoire et que l'application peut être exécutée sur un ordinateur 64 bits, vous devez appeler Wow64DisableWow64FsRedirectionfunction avant d'appeler FindFirstFile, puis Wow64RevertWow64FsRedirection après le dernier appelez FindNextFile. Pour plus d'informations, voir Redirecteur de système de fichiers.

Voici le lien

Je devrai mettre à jour mon code pour cette raison: -)

Etes-vous sûr qu'il cherche dans le même répertoire que la commande dir? Ils ne semblent pas avoir de fichiers en commun.

En outre, ce n'est pas le problème, mais le caractère générique correct pour "tous les fichiers". est *

*. * signifie " tous les fichiers avec au moins un. au nom ""

Y at-il des avertissements lors de la compilation?

Avez-vous activé les avertissements ALL pour ce test particulier (car il ne fonctionne pas)?

Assurez-vous d'abord de résoudre les avertissements.

Il n'y a pas de problèmes avec l'exemple de code. J'ai une autre application qui échoue aussi, écrite en Delphi. Je pense avoir trouvé la réponse sur la base de la réponse de Kris à propos de la redirection: http://msdn.microsoft.com/en-gb /library/aa364418(VS.85).aspx

J'ai compris:

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

Lorsqu'une application 32 bits lit l'un de ces dossiers sur un système d'exploitation 64 bits:

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

Windows répertorie en fait le contenu de:

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

Merci pour votre contribution, Kris, qui m'a aidé à comprendre ce qui se passe.

EDIT: Merci Ludvig aussi: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top