2016-12-22 52 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 

} 

当OS是在西班牙,该值更改为“档案馆JPG”,所以我不得不验证所有语言,并没有意义。

任何想法我可以使用什么其他功能?

回答

1

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

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

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

这可能会失败,以防用户附加了错误的文件扩展名。但可以说,这不是你的应用程序应该修复的东西。


顺便说一句,你传递给 SHGFI_USEFILEATTRIBUTESSHGetFileInfoW决定不通过任何 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'代码。 –