当文件具有拉丁字符时,CreateFile失败(ERROR_FILE_NOT_FOUND)

时间:2014-09-05 09:01:47

标签: c file-io file-not-found latin

我试图用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()通过文件夹的文件进行迭代时,我得到了这样的结果:

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

我不知道如何让它知道hol□.mp3应该是holá.mp3

顺便说一句,如果文件夹是具有重音的文件夹,则FindFirstFile()会失败。

1 个答案:

答案 0 :(得分:3)

就像Windows告诉你的那样。具有该名称的文件不存在。虽然你认为你的名字是正确的,但系统告诉你你没有。系统是正确的。

可能是

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

不会导致ws具有所需的值。

FWIW,FILE_ATTRIBUTE_ARCHIVE在打开现有文件时没有影响,仅在创建文件时。如果您还包含SECURITY_IMPERSONATION,则SECURITY_SQOS_PRESENT才会生效。