문제

C++Builder 2007을 사용하면 FindFirstFile 및 FindNextFile 함수가 64비트 버전의 Vista 및 XP에서 일부 파일을 찾을 수 없는 것 같습니다.내 테스트 응용 프로그램은 32비트입니다.

이를 사용하여 C:\Windows\System32\Drivers 폴더를 반복하면 명령 프롬프트에서 dir 명령을 실행할 때 185개의 파일이 있지만 소수의 파일만 찾습니다.동일한 예제 코드를 사용하면 32비트 버전의 XP에서 모든 파일이 제대로 나열됩니다.

다음은 작은 예제 프로그램입니다:

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

64비트 XP의 C:\Windows\System32\Drivers 폴더에서 실행하면 다음이 반환됩니다.

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.

동일한 시스템의 dir 명령은 다음을 반환합니다.

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.

나는 의아해한다.그 이유는 무엇입니까?

브라이언

도움이 되었습니까?

해결책

리디렉션이 진행되고 있나요?Wow64DisableWow64FsRedirection에 대한 설명을 참조하세요. http://msdn.microsoft.com/en-gb/library/aa365743.aspx

다른 팁

MSDN에서 이것을 찾았습니다.

디렉터리의 모든 파일을 나열하기 위해 32비트 응용 프로그램을 작성 중이고 해당 응용 프로그램이 64비트 컴퓨터에서 실행될 수 있는 경우 FindFirstFile을 호출하기 전에 Wow64DisableWow64FsRedirection 함수를 호출하고 FindNextFile에 대한 마지막 호출 후에 Wow64RevertWow64FsRedirection을 호출해야 합니다.자세한 내용은 파일 시스템 리디렉터를 참조하세요.

링크는 여기

이 때문에 코드를 업데이트해야 합니다 :-)

dir 명령과 동일한 디렉토리를 찾고 있습니까?공통된 파일이 없는 것 같습니다.

또한 이는 문제가 아니지만 "모든 파일"에 대한 올바른 와일드카드는 *입니다.

*.*는 "최소 하나의 .이름으로"

컴파일할 때 경고가 있나요?

돌아섰나요? 모두 이 특정 테스트에 대해 경고가 표시됩니까(작동하지 않기 때문에)?

먼저 경고를 해결하십시오.

예제 코드에는 문제가 없습니다.Delphi로 작성된 또 다른 응용 프로그램도 실패했습니다.리디렉션에 대한 Kris의 답변을 바탕으로 답변을 찾은 것 같습니다.http://msdn.microsoft.com/en-gb/library/aa364418(VS.85).aspx

알았어요:

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

32비트 애플리케이션이 64비트 OS의 다음 폴더 중 하나에서 읽는 경우:

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

Windows에는 실제로 다음 내용이 나열됩니다.

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

Kris님의 의견에 감사드립니다. 무슨 일이 일어나고 있는지 알아내는 데 도움이 되었습니다.

편집하다:루드빅님도 감사드립니다 :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top