強制重新整理圖示快取

大頭發表於2015-11-25

開發Mac平臺的應用程式時遇到一個熱更新圖示的需求。

Mac的應用程式是.app bundle,圖示檔案放在test.app/Contents/Resources/路徑,在test.app/Contents/Info.plist中指定。

可是,更換.icns圖示檔案後,Finder裡不即時更新顯示。如何繞開快取機制,強制重新整理顯示圖示呢?當然,得是以程式設計方式實現。

搜到一些建議。

重建Launch Services資料庫,

lsregister -kill -seed -r
lsregister -f <.app path>

無效。
修改bundle的時間戳。

touch /Applications/App.app

無效。

有人提到“建立-刪除”一個檔案的方法,有人嘗試了這個方法,告訴大家說,他嘗試了所有bundle裡的目錄都無效,除了test.app/。測試有效。謝謝他。

Qt測試程式碼,建立一個資料夾,再刪除,

QDir junk;
junk.mkdir(strBundlePath + "/junk");
junk.rmdir(strBundlePath + "/junk");

可是緊接著在其他電腦上測試發現,有時還是無效。

研究發現,無效時,test.app/bundle目錄裡有一個檔案Icon?

它其實是Icon\r,終端裡的自動補全會顯示為Icon^M。這個檔案是幹嗎用的?怎麼產生的?這裡有詳細介紹

說是改變資料夾圖示時會產生這個檔案,實測發現,只在右鍵test.appbundle選擇“Get Info”,拖動圖片檔案到Info對話方塊左上角圖示位置時,會產生這個檔案。不知道有沒有其他動作也會。

有這個檔案的時候,前面說的“建立-刪除”資料夾/檔案方法無效,可能的原因是“when you change the icon, it is not actually applied to the folder itself but rather to the 'Icon\r' file inside the folder”。

解決方案是刪除它。測試程式碼如下,

QFile jfile(strBundlePath + "/Icon\r");
if(jfile.exists())
    jfile.remove();
QDir junk;
junk.mkdir(strBundlePath + "/junk");
junk.rmdir(strBundlePath + "/junk");

專案里加上這樣的程式碼真是無奈,所謂笨辦法吧。

Windows平臺上,新圖示編譯在.exe檔案裡,可是.exe檔案熱更新後,桌面的快捷方式圖示一樣存在快取不能立刻重新整理的問題。思路類似,沒再嘗試,舉例如下,來自這篇部落格

rem 關閉Windows外殼程式explorer
taskkill /f /im explorer.exe
rem 清理系統圖示快取資料庫
attrib -h -s -r "%userprofile%\AppData\Local\IconCache.db"
del /f "%userprofile%\AppData\Local\IconCache.db"
attrib /s /d -h -s -r "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\*"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_32.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_96.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_102.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_1024.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_idx.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_sr.db"
rem 清理 系統托盤記憶的圖示
echo y|reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v IconStreams
echo y|reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v PastIconsStream
rem 重啟Windows外殼程式explorer
start explorer

相關文章