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

Ser*_*ron 3 winapi

我试图识别文件何时为 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);
Run Code Online (Sandbox Code Playgroud)

这就是我验证的方式:

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

//Code here

}
Run Code Online (Sandbox Code Playgroud)

当操作系统使用西班牙语时,该值会更改为“Archivo JPG”,因此我必须针对所有语言进行验证,这是没有意义的。

知道我还可以使用什么其他功能吗?

IIn*_*ble 5

该 API 旨在用于为已知文件类型生成面向用户的字符串表示形式1)。它并不意味着用于实现代码逻辑。

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

问题的解决方案很简单:除了过滤文件扩展名之外,您无需执行任何操作。使用PathFindExtension(或Windows 8 及更高版本的PathCchFindExtension)从完全限定路径名获取文件扩展名。

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


顺便说一句,您传递SHGFI_USEFILEATTRIBUTESSHGetFileInfoW但决定不将任何文件属性(第二个参数)传递给调用。这是一个错误。请参阅SHGFI_USEFILEATTRIBUTES 是什么意思?了解详情。


1) 它在道德上相当于SHGFI_DISPLAYNAME您对显示名称唯一能做的就是显示它们