zoukankan      html  css  js  c++  java
  • 强制刷新图标缓存

    开发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 ,终端里的自动补全会显示为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 ' file inside the folder”。

    解决方案是删除它。测试代码如下,

    QFile jfile(strBundlePath + "/Icon
    ");
    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%AppDataLocalIconCache.db"
    del /f "%userprofile%AppDataLocalIconCache.db"
    attrib /s /d -h -s -r "%userprofile%AppDataLocalMicrosoftWindowsExplorer*"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_32.db"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_96.db"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_102.db"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_256.db"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_1024.db"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_idx.db"
    del /f "%userprofile%AppDataLocalMicrosoftWindowsExplorer	humbcache_sr.db"
    rem 清理 系统托盘记忆的图标
    echo y|reg delete "HKEY_CLASSES_ROOTLocal SettingsSoftwareMicrosoftWindowsCurrentVersionTrayNotify" /v IconStreams
    echo y|reg delete "HKEY_CLASSES_ROOTLocal SettingsSoftwareMicrosoftWindowsCurrentVersionTrayNotify" /v PastIconsStream
    rem 重启Windows外壳程序explorer
    start explorer
  • 相关阅读:
    JVM知识体系
    RabbitMQ学习11死信队列(拒绝消息)
    JUC知识体系
    RabbitMQ学习10死信队列(队列达到最大长度)
    Dropdownlist+objectdatasource设定“请选择”默认选项
    sql DATEPART函数使用
    win7 'IIS APPPOOL\Classic .NET AppPool' 登录失败
    sqlserver2000还原数据库时报设备激活错误的解决方法
    vss和vs2008组合搭建源代码管理器
    在配置win7 IIS浏览网站时 检测到在集成的托管管道模式下不适用的ASP.NET设置 的解决方法
  • 原文地址:https://www.cnblogs.com/loveisbug/p/4994605.html
Copyright © 2011-2022 走看看