您尚未登录。

楼主 # 2023-03-16 17:39:08

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行?

在考虑qt应用程序自升级的问题。
搜到了QSimpleUpdater这个库,https://github.com/alex-spataru/QSimpleUpdater
没明白其原理,主要是3个.cpp文件,现在理解如下:
  Downloader:   下载器,删除旧文件,下载新文件,重命名文件;
  Updater: 下载json文件,获取版本信息,下载文件地址,创建Downloader对象进行文件下载;
  QSimpleUpdater: 静态类,可以创建多个Updater对象来进行多个不同文件下载;

不明白的地方:
程序运行过程中,可以删除本应用程序可执行文件?

最近编辑记录 Gentlepig (2023-03-16 17:40:17)

离线

#1 2023-03-17 10:07:31

死磕南墙
会员
注册时间: 2020-12-22
已发帖子: 8
积分: 23

Re: 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行?

一般更新程序下载先放在临时目录下,然后创建一个shell脚本进行程序替换并启动新程序,最后由Qt创建一个进程执行shell脚本,主程序退出。

离线

#2 2023-03-17 11:18:39

davidxu
会员
注册时间: 2021-04-13
已发帖子: 12
积分: 2

Re: 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行?

应用是加载到内存中运行的

离线

楼主 #3 2023-03-17 11:58:33

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行?

运行例程,且修改json文件为指定的网址,确实可以下载指定文件,且下载前先删除了应用程序文件,但应用仍可执行。

遇到了些问题,下载后的文件默认没有可执行权限,调用chmod +x给了权限。
qsimpleupdater代码里是通过qdesktopservices()打开下载的本地文件的,打开时报错:没有应用程序注册为处理此文件的。

 182 void Downloader::openDownload()
    1 {
    2    if (!m_fileName.isEmpty())
    3       QDesktopServices::openUrl(QUrl::fromLocalFile(m_downloadDir.filePath(m_fileName)));
    4 
    5    else
    6    {
    7       QMessageBox::critical(this, tr("Error"), tr("Cannot find downloaded update!"), QMessageBox::Close);
    8    }
    9 }

离线

楼主 #4 2023-03-17 11:59:33

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行?

死磕南墙 说:

一般更新程序下载先放在临时目录下,然后创建一个shell脚本进行程序替换并启动新程序,最后由Qt创建一个进程执行shell脚本,主程序退出。

请教,这样做,相比删掉正在运行的文件然后下载新的过去,有什么优点呢?

离线

#5 2023-03-17 14:55:06

死磕南墙
会员
注册时间: 2020-12-22
已发帖子: 8
积分: 23

Re: 应用程序运行过程中,是否可以把应用程序的可执行文件删除?删除后正在运行的程序能否正常运行?

@Gentlepig
这样做可以减少出现意外情况的风险,比如说,你下载过程中出现网络问题或者意外关机(断电),至少下次开机时还能有一个可以运行的程序。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn