FindNextFile falha em Windows de 64 bits?
-
01-07-2019 - |
Pergunta
usando C ++ Builder 2007, as funções FindNextFile FindFirstFile e não parece ser capaz de encontrar alguns arquivos em versões do Vista e XP de 64 bits. Meu aplicativo de teste é de 32 bits.
Se eu usá-los para percorrer a pasta C: \ Windows \ System32 \ Drivers eles só encontrar um punhado de arquivos, embora existam 185 quando eu emitir um comando dir em um prompt de comando. Usando o mesmo exemplo listas de códigos todos os arquivos finas em uma versão do XP de 32 bits.
Aqui é um programa pequeno exemplo:
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;
}
Executá-lo na pasta C: \ Windows \ System32 \ Drivers em 64-bit XP retorna o seguinte:
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.
Um comando dir no mesmo sistema retorna o seguinte:
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.
Estou intrigado. Qual é a razão para isso?
Brian
Solução
Existe redirecionamento acontecendo? Veja os comentários sobre Wow64DisableWow64FsRedirection http://msdn.microsoft.com/en-gb/ biblioteca / aa365743.aspx
Outras dicas
Eu encontrei este no MSDN:
Se você estiver escrevendo um aplicativo de 32 bits para listar todos os arquivos em um diretório e o aplicativo pode ser executado em um computador de 64 bits, você deve chamar o Wow64DisableWow64FsRedirectionfunction antes de chamar FindFirstFile e Wow64RevertWow64FsRedirection chamada após a última chamar para FindNextFile. Para mais informações, consulte Sistema de Arquivos Redirector.
Vou ter que atualizar meu código por causa disso: -)
Você tem certeza de que está à procura no mesmo diretório que o comando dir? Eles não parece ter quaisquer arquivos em comum.
Além disso, este não é o problema, mas o wild card correto para "todos os arquivos" é *
*. * Significa "todos os arquivos com pelo menos um. No nome"
Existem quaisquer avisos quando você compila?
Você virou ALL avisos sobre para este teste específico (uma vez que não está funcionando)?
Certifique-se primeiro a resolver os avisos.
Não há problemas com o código de exemplo. Eu tenho um outro aplicativo que falhar também, escrito em Delphi. Acho que encontrei a resposta com base na resposta de Kris sobre o redirecionamento: http://msdn.microsoft.com/en-gb /library/aa364418(VS.85).aspx
Got-lo:
http://msdn.microsoft.com/ en-gb / biblioteca / aa384187 (VS.85) .aspx
Quando um aplicativo de 32 bits lê a partir de uma dessas pastas em um SO de 64 bits:
%windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool
Windows realmente lista o conteúdo:
%windir%\SysWOW64\catroot
%windir%\SysWOW64\catroot2
%windir%\SysWOW64\drivers\etc
%windir%\SysWOW64\logfiles
%windir%\SysWOW64\spool
Obrigado pelo seu contributo Kris, que me ajudou a descobrir o que está acontecendo.
EDIT: Obrigado Ludvig também: -)