强制刷新图标缓存

开发Mac平台的应用程序时遇到一个热更新图标的需求。html

Mac的应用程序是.app bundle,图标文件放在test.app/Contents/Resources/路径,在test.app/Contents/Info.plist中指定。数据库

但是,更换.icns图标文件后,Finder里不即时更新显示。如何绕开缓存机制,强制刷新显示图标呢?固然,得是以编程方式实现。编程

搜到一些建议。缓存

重建Launch Services数据库,app

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

无效。ide

修改bundle的时间戳。测试

touch /Applications/App.app

无效。spa

有人提到“建立-删除”一个文件的方法,有人尝试了这个方法,告诉你们说,他尝试了全部bundle里的目录都无效,除了test.app/。测试有效。谢谢他。code

Qt测试代码,建立一个文件夹,再删除,htm

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
相关文章
相关标签/搜索