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

Foi útil?

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.

Aqui está o link

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: -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top