2014-09-05 4 views
1

C로 파일을 열려고하는데 Windows에 파일에 라틴 문자가 있으면 문제가 발생합니다. 파일이 이상한 성격을 가지고 있지만, 그렇게되면 오류 2 (ERROR_FILE_NOT_FOUND)와 함께 실패하지 않습니다파일에 라틴 문자가있는 경우 CreateFile이 실패 함 (ERROR_FILE_NOT_FOUND)

hFile = CreateFileW(ws, // file to be opened 
GENERIC_READ, // open for reading 
FILE_SHARE_READ, // share for reading 
NULL, // default security 
OPEN_EXISTING, // open existing file only 
FILE_ATTRIBUTE_NORMAL |FILE_ATTRIBUTE_ARCHIVE | SECURITY_IMPERSONATION, 
// normal file archive and impersonate client 
NULL); // no attr. template 

if(hFile == INVALID_HANDLE_VALUE) 
    printf("Could not open %ls file, error %d\n", ws, GetLastError()); 
else 
    printf("File's HANDLE is OK!\n"); 

// when finished, close the file handle 
CloseHandle(hFile); 

완벽하게 작동

이 코드.

C:\Documents and Settings\Administrador\Escritorio\hola.mp3 

출력이

File's HANDLE is OK! 

입니다하지만이 파일 :

C:\Documents and Settings\Administrador\Escritorio\holá.mp3 

출력이

입니다이 파일을 예를 들어

-

Could not open C:\Documents and Settings\Administrador\Escritorio\holá.mp3 file, error 2 

두 파일 모두 해당 위치에 있습니다.

char* filename; 
wchar_t ws[256]; 

// I get the filename from the SDK I am using (Cycling'74 Max SDK) 
filename = (atom_getsym(argv))->s_name; 
// and convert it to UTF16 
AnsiToUnicode16(filename, ws, 256); 

AnsiToUnicode16

변환을 할 MultiByteToWideChar을 사용하고 있습니다 : -

이 WS의 초기화이다.

- 나는 폴더의 파일을 통해 반복 FindFirstFile을()를 사용하는 경우

나는이 결과를 얻을 :

  • 다음 파일 이름이 hola.mp3입니다.
  • 다음 파일 이름은 hol □ .mp3입니다.

hol□.mp3holá.mp3이어야한다는 것을 알리는 방법에 대해서는 잘 모릅니다.

BTW, 폴더가 액센트가있는 경우 FindFirstFile()이 실패합니다.

+1

programm의 출력과 문제가되는 파일 이름을 추가 할 수 있습니까? – CollioTV

+0

''ws'가 어떻게 정의되고 초기화됩니까? – alk

+0

두 개를 모두 추가했습니다 – LuisHerranz

답변

3

간단히 말해서 Windows가 알려줍니다. 해당 이름의 파일이 없습니다. 이름이 맞다고 생각하는 동안, 시스템은 당신에게 당신이하지 않았다는 것을 알려줍니다. 시스템이 올바른 것입니다.

아마도

filename = (atom_getsym(argv))->s_name; 
AnsiToUnicode16(filename, ws, 256); 

결과가 원하는 값을 갖는 ws로 연결되지 않는다.

기존 파일을 열 때 FWIW, 은 영향을 미치지 않으며 파일을 만들 때만 적용됩니다. SECURITY_IMPERSONATIONSECURITY_SQOS_PRESENT도 포함하면 효과가 있습니다.

+0

그러나'ws'를 출력 할 때 값은 정확합니다 :'C : \ Documents and Settings \ Administrador \ Escritorio \ Mórdaz -Yo Rockanrolleo.mp3' – LuisHerranz

+2

올바른 경우 시스템이 파일을 찾습니다. 필자가 제안하는 것은 파일을 찾을 때까지'FindFirstFile','FindNextFile'을 사용하여 디렉토리 내용을 열거하는 것입니다. 그런 다음 검색 레코드의 이름과'ws '의 값을 이진 비교합니다. –

+0

감사합니다. @ David Heffman. 나는 성공적으로 그 작업을 수행했고 그 폴더에서 반복 할 때 : - 다음 파일 이름은 hola.mp3입니다. - 다음 파일 이름은 hol .mp3입니다. 악센트가 /fólder/file.ext와 같은 폴더에있을 때이 방법을 사용하면 부분적으로 만 문제가 해결됩니다. – LuisHerranz

관련 문제