2014-09-05 5 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.

BTW, если папка имеет тот, у кого есть акцент, FindFirstFile() терпит неудачу.

+1

Можете ли вы добавить вывод своей программы и имя файла, что является проблематичным? – CollioTV

+0

Как определяется и инициализируется 'ws'? – alk

+0

Я добавил оба – LuisHerranz

ответ

3

Это просто, как Windows говорит вам. Файл с таким именем не существует. Хотя вы считаете, что получили правильное название, система сообщает вам, что вы этого не сделали. Система правильная.

Предположительно результат

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

не приводит к ws имеющей нужное значение.

FWIW, FILE_ATTRIBUTE_ARCHIVE не влияет на открытие существующего файла, только при создании файла. И SECURITY_IMPERSONATION имеет эффект, если вы также включили SECURITY_SQOS_PRESENT.

+0

Но когда я печатаю 'ws' значение кажется правильным:' C: \ Documents and Settings \ Администратор \ Escritorio \ Mórdaz -Yo Rockanrolleo.mp3' – LuisHerranz

+2

Если бы это было правильно, система найдет файл. Я предлагаю вам использовать 'FindFirstFile',' FindNextFile', чтобы перечислять содержимое каталога до тех пор, пока вы не найдете файл. А затем выполните двоичное сравнение имени из записи поиска со значением в 'ws'. –

+0

Спасибо @ Давид Хеффман. Я успешно сделал это, и когда я перебираю в этой папке, я получаю: - Следующее имя файла - hola.mp3. - Название следующего файла - hol □ .mp3. Этот подход терпит неудачу, когда акцент находится в папке (например, /fólder/file.ext), поэтому он частично разрешит проблему. – LuisHerranz