我试图识别文件何时为 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”,因此我必须针对所有语言进行验证,这是没有意义的。
知道我还可以使用什么其他功能吗?
该 API 旨在用于为已知文件类型生成面向用户的字符串表示形式1)。它并不意味着用于实现代码逻辑。
更重要的是,它不会尝试解析文件内容。它仅根据文件扩展名工作。如果您将 Excel 工作簿MySpreadsheet.xlsx重命名为MySpreadsheet.png,它会很高兴地报告这是一个“PNG 文件”。
问题的解决方案很简单:除了过滤文件扩展名之外,您无需执行任何操作。使用PathFindExtension(或Windows 8 及更高版本的PathCchFindExtension)从完全限定路径名获取文件扩展名。
如果用户附加了错误的文件扩展名,这可能会失败。不过,可以说,这不是您的应用程序应该解决的问题。
顺便说一句,您传递SHGFI_USEFILEATTRIBUTES
给SHGetFileInfoW
但决定不将任何文件属性(第二个参数)传递给调用。这是一个错误。请参阅SHGFI_USEFILEATTRIBUTES 是什么意思?了解详情。
1) 它在道德上相当于SHGFI_DISPLAYNAME
。您对显示名称唯一能做的就是显示它们。