2016-12-22 55 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'代碼。 –