我试图用C打开文件,但是当文件在Windows中有拉丁字符时我遇到了问题。
此代码
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()通过文件夹的文件进行迭代时,我得到了这样的结果:
我不知道如何让它知道hol□.mp3
应该是holá.mp3
。
顺便说一句,如果文件夹是具有重音的文件夹,则FindFirstFile()会失败。
答案 0 :(得分:3)
就像Windows告诉你的那样。具有该名称的文件不存在。虽然你认为你的名字是正确的,但系统告诉你你没有。系统是正确的。
可能是
的结果filename = (atom_getsym(argv))->s_name;
AnsiToUnicode16(filename, ws, 256);
不会导致ws
具有所需的值。
FWIW,FILE_ATTRIBUTE_ARCHIVE
在打开现有文件时没有影响,仅在创建文件时。如果您还包含SECURITY_IMPERSONATION
,则SECURITY_SQOS_PRESENT
才会生效。