Winapi 使用Windows API获取文件的文件类型

Winapi 使用Windows API获取文件的文件类型,winapi,Winapi,我试图识别文件是PNG还是JPG,以便将其应用为壁纸。我正在使用SHGetFileInfo获取带有.szTypeName变量的类型名,但我刚刚意识到,如果操作系统使用另一种语言,它会发生变化 这是我的代码: SHFILEINFOW fileInfo; UINT sizeFile = sizeof(fileInfo); UINT Flags = SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES; // Getting file info to find out

我试图识别文件是PNG还是JPG,以便将其应用为壁纸。我正在使用
SHGetFileInfo
获取带有
.szTypeName
变量的类型名,但我刚刚意识到,如果操作系统使用另一种语言,它会发生变化

这是我的代码:

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”,因此我必须针对所有语言进行验证,这是没有意义的


知道我还可以使用什么函数吗?

此API用于为已知文件类型生成面向用户的字符串表示1)。它不是用来实现代码逻辑的

更重要的是,它不会尝试解析文件内容。它仅在文件扩展名下工作。如果将Excel工作簿MySpreadsheet.xlsx重命名为MySpreadsheet.png,它会很高兴地报告这是一个“png文件”

您的问题的解决方案很简单:除了对文件扩展名进行过滤之外,您不必做任何事情。使用(或对于Windows 8及更高版本)从完全限定的路径名获取文件扩展名

如果用户附加了错误的文件扩展名,则此操作可能会失败。可以说,这不是应用程序应该解决的问题


另外,您将
SHGFI\u USEFILEATTRIBUTES
传递给
SHGetFileInfoW
,但决定不向调用传递任何(第二个参数)。这是一个错误。有关详细信息,请参阅



1) 它在道德上等同于SHGFI\u DISPLAYNAME

谢谢你的回答!这就是我所需要的。我使用了
PathFindExtension
PWSTR-findextension=PathFindExtensionW(argv[1])
函数并删除了所有
SHGetFileInfoW
代码。