本文将在上一篇文章应用程序自动更新解决方案的基础上讨论一种新型的应用程序自动更新解决方案。

获取新版本程序

过程略,详见上篇文章。

双目录更新法

双目录更新法也是现在很普遍的做法,谷歌Chrome,微软OneDrive都在使用这种方法。双目录更新法就是把不同的版本放到不同的目录中,下次用户启动的时候就直接启动新版本。

比如程序有如下的目录结构:

Application
> 1.0.0             # 旧版程序目录
> 1.0.1             # 新版程序目录
    > myapp.exe     # 主程序
    > *.dll
> conf              # 配置文件路径
    > conf.ini
> data              # 数据(库)文件路径
> launcher.exe      # 新版启动器
> launcher.exe.old  # 旧版启动器
> logs              # 日志文件路径
> Uninstall.exe     # 卸载程序
> Uninstall.xml     # 卸载文件清单

如果想把主程序放到根目录,可以使用延时加载DLL的、并使用SetDllDirectory设置DLLs路径的方法把主程序放到根目录。但是如果是Qt程序,QtQt5Gui.dll不支持延时加载,暂时只能把启动器(launcher.exe)放到程序根目录下,通过启动器调用主程序。

更新过程

双目录更新法的更新过程大致如下:

  • 将Zip更新包(假如文件名为myapp_1.2.4.zip)下载到update文件夹中;
  • 可以使用XZip/XUnzip解压缩,遍历update/myapp_1.2.4.zip包中的文件;
  • 将新版程序文件夹(假如文件名为1.2.4)及文件夹下的子文件(保持目录结构)解压到程序根目录,
  • 将旧版程序文件夹(假如文件名为1.2.3)及文件夹下的子文件全部删除(可以使用MoveFileTransacted(MOVEFILE_DELAY_UNTIL_REBOOT)延时删除)。
  • 将程序根目录下的旧版启动器(launcher.exe)或主程序重命名为*.old (可以使用MoveFileTransacted(MOVEFILE_REPLACE_EXISTING) ),之后再将其删除(可以使用MoveFileTransacted(MOVEFILE_DELAY_UNTIL_REBOOT)延时删除)。
  • 最后将新版启动器(launcher.exe)或主程序更新到程序根目录下,如果前面使用了MoveFileTransacted,则需要使用CommitTransaction函数提交事务。
  • 删除Zip更新包。
  • 全部更新完成后重启程序即可,旧版程序文件会在Windows系统下次启动时删除。

    注意如果使用MOVEFILE_DELAY_UNTIL_REBOOT需要拥有注册表修改权限,如果升级过程中出现错误,可以使用RollbackTransaction函数回滚操作。

总结

这篇文章只是提供了一种程序自动更新的参考,你可以和上一篇文章应用程序自动更新解决方案中介绍的方法结合使用。

标签: 部署, 自动更新, 自动升级

添加新评论