需求描述

一直用Qt开发PC版本的程序,常用的方法都是打包发布。目前开发的程序比较复杂,涉及到上百个独立的进程以及4000多个相关文件,采用原来的打包发布就变得很麻烦,第一改动比较频繁,打包次数过多;第二安装包过大,用户那边更新也很麻烦;第三,更新文件的维护也麻烦。所以,支持在线升级,就变得很重要,通过两个版本的迭代设计,设计了一款通用在线升级系统,目前来看效果还是相当不错。

效果图

使用流程:

  1. 将程序的第一个版本打包成一个安装包,其中包括升级客户端程序;
  2. 需要更新的时候,将文件更新到服务器中,并提交更新,可以在版本信息中,提交升级说明;
  3. 客户端点击检查升级,会获取此次需要更新的文件以及缺失的文件,并从服务器上下载;
  4. 客户端不仅能够用于升级,也可用于安装文件的恢复。



设计要点

  1. 需要一个有公网地址的云服务器,用作升级服务器;
  2. 文件的更新检查通过MD5值来校验;
  3. 文件的更新类型分为两种。一种是覆盖更新,覆盖原有文件;一种是跳过更新,如果文件存在则跳过,不存在则增加,主要是针对于用户的一些配置文件;
  4. 文件的下载通过sftp协议;
  5. 需要更新的文件,需要拷贝到云服务器上;
  6. 服务端,点击检查修改以后,将当前目录下所有的文件都进行MD5值检查并与数据库中的MD5进行比较,如果数据库中不存在则为新增,MD5值不一致则为文件已修改,通过提交按钮,服务端更新数据库中的文件信息以及版本号自动累加;
  7. 客户端首先获取本地数据库中的版本信息,并从服务端获取本地版本与最新版本之间需要更新的文件信息,并更新本地数据库;
  8. 客户端依据最新的本地数据库,比对校验本地文件的MD5值,从而生成文件更新列表;
  9. 客户端依次从服务端下载更新文件;
  10. 完成系统的升级;
  11. 此系统也存在一些不足,升级前没有对原有文件进行备份,不能回退版本。

核心代码

//文件的MD5值计算
QString CDBOper::FileMD5(const QString &filePath)
{QString MD5;QFile file(filePath);if(file.open(QIODevice::ReadOnly)){QByteArray str;str = QCryptographicHash::hash(file.readAll(),QCryptographicHash::Md5);MD5.append(str.toHex());}return MD5;
}//文件的递归检查
int CCheckPage::FindFile(const QString &_filePath)
{QDir dir(_filePath);   //QDir的路径一定要是全路径,相对路径会有错误if(!dir.exists())return -1;//取到所有的文件和文件名,去掉.和..文件夹dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);dir.setSorting(QDir::DirsFirst);//将其转化为一个listQFileInfoList list = dir.entryInfoList();if(list.size()<1)return -1;int i = 0;//采用递归算法do {QFileInfo fileInfo = list.at(i);bool bisDir = fileInfo.isDir();if(bisDir){FindFile(fileInfo.filePath());}else{QString fileName = fileInfo.filePath().mid(m_prefLen);QString md5 = m_dbOper->FileMD5(fileInfo.filePath());QString md50 = m_dbOper->FileExits(fileName);if(md50.isEmpty()){json_object obj;obj.insert("status", "add");obj.insert("name", fileName);obj.insert("type", fileInfo.suffix());obj.insert("install", m_dbOper->FileInstall(fileName));obj.insert("md5", md5);m_array.append(obj);}else if(md5 != md50){json_object obj;obj.insert("status", "changed");obj.insert("name", fileName);obj.insert("type", fileInfo.suffix());obj.insert("install", m_dbOper->FileInstall(fileName));obj.insert("md5", md5);m_array.append(obj);}}++i;}while(i<list.size());return 0;
}

软件在线升级系统设计相关推荐

  1. 软件包管理 之 软件在线升级更新yum 图形工具介绍

    作者:北南南北 来自:LinuxSir.Org 提要:yum 是Fedora/Redhat 软件包管理工具,包括文本命令行模式和图形模式:图形模式的yum也是基于文本模式的:目前yum图形前端程序主要 ...

  2. Qt软件在线升级功能-逻辑分享

    因为软件需要完成在线升级功能,主要提供给内部人员使用,经常使用U盘拷贝很不方便,所以用了两天时间吧在线升级功能做了出来,开始我也是在网上找资料,看了很多大多都是C/S框架下一个服务器端,一个客户端,所 ...

  3. 一种迪文屏软件在线升级方法

    --来自迪文开发者论坛 开发自己的项目中遇到文件升级不方便的问题,因此设计了一个在线升级方案,可以有效解决如下问题: 1. 当产品已发出需要修复Bug时,无法在线修复. 2. 无法判断新老版本,当数据 ...

  4. 利用Web Services实现软件自动升级

    摘 要:软件维护升级工作是软件生命周期最重要的环节.为了解决以往C/S(Client/Server)模式下的客户端软件升级效率低的问题,设计了C/S应用系统自动升级处理程序.该程序利用Web Serv ...

  5. [转载]利用Web Services实现软件自动升级

    [---  资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力, 如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除.同时本人深表歉意,并致以崇高的谢意! ...

  6. 用C#实现C/S模式下软件自动在线升级[转载]

    摘要: 本文针对目前C/S模式下编写的应用程序可维护性差的特点,提出了一套自动在线升级的解决方案,分析了在线升级的困难及实现原理,并给出了实现升级的部分代码,具有实际参考价值和现实意义.本文程序代码均 ...

  7. C# 实现在线软件自动升级自动下载更新文件

    1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C /S结构的程序可维护性差,布置困难,升级不方便,维护成本高就 ...

  8. 苹果手机软件升级密码_iPhone在线升级好?还是电脑上升级好?看完不再纠结

    手机已经成为每个人的必需品,除了一些非智能机.智能机都是需要更新系统的,比如我们iOS12更新到iOS13. 更新系统会带来一些新的版本号,新的功能,修复此前系统中的bug,优化手机性能等等.正常来说 ...

  9. asp毕业设计—— 基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码)——软件信息发布系统

    基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的软件信息发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需 ...

最新文章

  1. 比特币现金在稳定币领域的地位怎样
  2. Linux下安装搜狗拼音输入法
  3. Java中可变长参数的使用及注意事项
  4. 【测试】ABAP发送HTML格式邮件FM
  5. ogm session_带有Hibernate OGM的NoSQL –第三部分:在WildFly上构建REST应用程序
  6. 可以在循环体内声明局部变量吗?
  7. ASP.net的地址重写(URLRewriter)实现原理及代码示例
  8. at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
  9. !!统计字符(处理字符串)(getline函数使用)
  10. spark sortBy sortByKey实战详解
  11. msql--基础使用
  12. 中国医大CT-YOUNG 闪讯和深澜并存的验证机制研究
  13. ie ajax十分卡,解决jquery .ajax 在IE下卡死问题的解决方法
  14. java实现手机扫描二维码下载功能
  15. Q - 统计硬币 HDU - 2566(母函数)
  16. windows系统文件名太长导致无法打开删除移动
  17. 【微信小程序】页面返回且带回数据
  18. 研究google搜索框代码
  19. SRS流媒体服务器搭建流程-简单实用版
  20. Protege使用教程(推理篇)

热门文章

  1. AI 版 Nature Index 排名,两种结果折射中国 AI 实力软肋(转载)
  2. 通过电线上网的方法——电力线适配器带给你全新体验
  3. isis network-entity 49含义_Brother数据备份方法 及 各文件含义介绍
  4. summernote 图片上传 php,summernote.js图片上传的使用
  5. 面向对象:往后余生,风雪是你,平淡是你,清贫是你,荣华是你
  6. ps学习如何做旋转花瓣#ps教程#ps学习基础视频#ps抠图
  7. 电脑查看WiFi使用密码
  8. 让你的编程之路少点坎坷,10个编程技巧、5个纠错步骤
  9. 小匕首-dotnet cli使用tool指令
  10. Spring Boot 项目的jsp页面引用css、js、img、fonts的问题解决