Pregunta

Al utilizar C++Builder 2007, las funciones FindFirstFile y FindNextFile no parecen poder encontrar algunos archivos en las versiones de 64 bits de Vista y XP.Mi aplicación de prueba es de 32 bits.

Si los uso para recorrer la carpeta C:\Windows\System32\Drivers, solo encuentran un puñado de archivos, aunque hay 185 cuando ejecuto un comando dir en el símbolo del sistema.Usando el mismo código de ejemplo se enumeran todos los archivos correctamente en una versión de 32 bits de XP.

Aquí hay un pequeño programa de ejemplo:

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

Ejecutarlo en la carpeta C:\Windows\System32\Drivers en XP de 64 bits devuelve esto:

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 en el mismo sistema devuelve esto:

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.

Estoy confundido.¿Cuál es la razón para esto?

brian

¿Fue útil?

Solución

¿Se está produciendo una redirección?Vea los comentarios sobre Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

Otros consejos

Encontré esto en MSDN:

Si está escribiendo una aplicación de 32 bits para enumerar todos los archivos en un directorio y la aplicación se puede ejecutar en una computadora de 64 bits, debe llamar a la función Wow64DisableWow64FsRedirection antes de llamar a FindFirstFile y llamar a Wow64RevertWow64FsRedirection después de la última llamada a FindNextFile.Para obtener más información, consulte Redirector del sistema de archivos.

Aquí está el enlace

Tendré que actualizar mi código debido a esto :-)

¿Está seguro de que busca en el mismo directorio que el comando dir?No parecen tener ningún archivo en común.

Además, este no es el problema, pero el comodín correcto para "todos los archivos" es *

*.* significa "todos los archivos con al menos un archivo .en el nombre"

¿Hay alguna advertencia al compilar?

¿Has girado? TODO ¿Advertencias activadas para esta prueba en particular (ya que no funciona)?

Asegúrate primero de resolver las advertencias.

No hay problemas con el código de ejemplo.Tengo otra aplicación que también falla, escrita en Delphi.Creo que encontré la respuesta basada en la respuesta de Kris sobre la redirección:http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

Entiendo:

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

Cuando una aplicación de 32 bits lee desde una de estas carpetas en un sistema operativo de 64 bits:

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

Windows en realidad enumera el contenido de:

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

Gracias por tu aporte Kris, eso me ayudó a descubrir qué está pasando.

EDITAR:Gracias Ludvig también :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top