2014-09-05 62 views
1

我試圖在C中打開文件,但當文件在Windows中具有拉丁字符時遇到問題。當文件具有拉丁字符時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); 

作品完全當文件沒有任何奇怪的字符,但失敗,錯誤2(ERROR_FILE_NOT_FOUND)當它。

-

例如,此文件:

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 

這兩個文件都存在於該位置。

-

這是WS的初始化:

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做轉換。

-

當我用用FindFirstFile()迭代直通文件夾中的文件,我得到這個結果:

  • 下一個文件名是hola.mp3。
  • 下一個文件名是hol□.mp3。

我不知道如何讓它知道hol□.mp3應該是holá.mp3

順便說一句,如果該文件夾是具有重音的文件夾,則FindFirstFile()失敗。

+1

你可以添加你的程序的輸出,和有問題的文件名? – CollioTV 2014-09-05 09:05:40

+0

請問ws是如何定義和初始化的? – alk 2014-09-05 09:19:42

+0

我已經添加了兩個 – LuisHerranz 2014-09-05 09:28:18

回答

3

就像Windows告訴你的一樣。具有該名稱的文件不存在。雖然你認爲你的名字是正確的,但系統告訴你,你沒有。該系統是正確的。

推測的

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

結果不會導致ws具有所需的值。

FWIW,FILE_ATTRIBUTE_ARCHIVE僅在創建文件時打開現有文件沒有影響。如果您還包含SECURITY_SQOS_PRESENT,則SECURITY_IMPERSONATION僅起作用。

+0

但是當我打印'ws'值似乎是正確的:'C:\ Documents和Settings \ Administrador \ Escritorio \Mórdaz-Yo Rockanrolleo.mp3' – LuisHerranz 2014-09-05 09:31:08

+2

如果這是正確的,那麼系統會發現該文件。我建議你做的是使用FindFirstFile,FindNextFile枚舉目錄的內容,直到找到文件。然後,將搜索記錄中的名稱與'ws'中的值進行二進制比較。 – 2014-09-05 09:32:42

+0

謝謝@David Heffman。 我已經成功地做到這一點,當我在該文件夾中的迭代,我得到: - 下一個文件名是hola.mp3。 - 下一個文件名是hol□.mp3。 這種方法時的重音的文件夾(如/fólder/file.ext)上,以便只將部分地解決該問題失敗。 – LuisHerranz 2014-09-05 10:39:15