2016-12-22 2 views
0

Я пытаюсь определить, когда файл PNG или JPG применяется для использования в качестве обоев. Я использую SHGetFileInfo, чтобы получить имя типа с переменной .szTypeName, но я просто понял, что он изменяется, если ОС находится на другом языке.Получить файл типа файла с помощью Windows API

Это мой код:

SHFILEINFOW fileInfo; 
UINT sizeFile = sizeof(fileInfo); 
UINT Flags = SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES; 

// Getting file info to find out if it has JPG or PNG format 
SHGetFileInfoW(argv[1], 0, &fileInfo, sizeFile, Flags); 

Это, как я проверка:

if (wcscmp(fileInfo.szTypeName, L"JPG File") == 0) 
{ 

//Code here 

} 

Когда ОС на испанском языке, изменяется значение для «Archivo JPG», так что я должен был бы утверждать против всего языка и не имеет смысла.

Любая идея, какую функцию я могу использовать?

ответ

1

Этот API предназначен для создания ориентированного на пользователя строкового представления для известных типов файлов 1). Он не предназначен для реализации логики кода.

Что еще более важно, он не пытается проанализировать файл содержание. Он работает только с расширением файла. Если вы переименуете книгу Excel MySpreadsheet.xlsx в MySpreadsheet.png, он с радостью сообщит, что это «Файл PNG».

Решение проблемы просто: вам не нужно ничего делать, кроме фильтрации на расширение файла. Используйте PathFindExtension (или PathCchFindExtension для Windows 8 и выше), чтобы получить расширение файла из полного имени пути.

Это может быть неудачно, если пользователь добавил неправильное расширение файла. Возможно, это не то, что ваше приложение должно исправить.


Как и в сторону, вы передаете SHGFI_USEFILEATTRIBUTES к SHGetFileInfoW, но решил не пропустить ни file attributes (второй аргумент) для вызова. Это ошибка. См. What does SHGFI_USEFILEATTRIBUTES mean?.


1) Это моральный эквивалент SHGFI_DISPLAYNAME. The only thing you can do with display names is display them.

+0

Спасибо за ответ! Это все, что мне нужно. Я использовал 'PathFindExtension' (' PWSTR findExt = PathFindExtensionW (argv [1]) 'функцию и удалил весь код' SHGetFileInfoW'. –