64비트 Windows에서 FindNextFile이 실패합니까?
-
01-07-2019 - |
문제
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님의 의견에 감사드립니다. 무슨 일이 일어나고 있는지 알아내는 데 도움이 되었습니다.
편집하다:루드빅님도 감사드립니다 :-)