2008-09-18 15 views
10

utilizando 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.FindNextFile falla en Windows de 64 bits?

Si los utilizo 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. El uso del mismo código de ejemplo enumera todos los archivos correctamente en una versión de 32 bits de XP.

Aquí es 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; 
} 

Correr en el directorio C: \ Windows \ System32 \ Drivers carpeta 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 perplejo. ¿Cuál es la razón para esto?

Brian

Respuesta

9

Es ¿Hay una redirección en marcha? Consulte los comentarios en Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/library/aa365743.aspx

+0

¿Cuáles son los archivos en C: \ Windows \ System64 \ Drivers? –

+0

Enumero los archivos en C: \ Windows \ System32 \ Drivers pero en realidad obtengo los archivos en C: \ Windows \ SysWOW64 \ Drivers :-) – JubbaJubba

0

¿Seguro que está mirando 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 correcta para "todos los archivos" * es

*. * Significa "todos los archivos con al menos uno. En el nombre"

0

¿Hay advertencias al compilar?

¿Ha activado ALL advertencias en esta prueba en particular (ya que no está funcionando)?

Primero asegúrese de resolver las advertencias.

2

He encontrado esto en MSDN:

Si está escribiendo una aplicación de 32 bits para listar todos los archivos en un directorio y la 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, vea File Redirector del sistema.

Here's the link

Voy a tener que actualizar mi código a causa de esto :-)

0

¡Gracias:

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

Cuando una aplicación de 32 bits se lee de 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 

de Windows en realidad muestra el contenido de:

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

Gracias por tu aportación Kris, que me ayudó a averiguar lo que está pasando.

EDIT: Gracias Ludvig también :-)

Cuestiones relacionadas