一、说明
互联网公司客户端软件升级通常分为:

  1. 普通升级 (判断条件是软件版本号)

    1. 增量升级
    2. 全量升级
  2. 强制升级
    1. 全量升级
  3. 灰度升级
    1.根据灰度策略,命中的客户端提示升级

版本升级的判断依据是版本号及其安装包释放文件的md5值。
普通升级的判断条件是软件版本号,强制升级的判断条件是软件基础版本号,或者当有大版本更新或者软件构建框架升级。
增量升级只下载替换md5变化的文件
全量升级重写下载安装包,走安装流程
二、文件md5获取

#ifndef FILEMD5INSTANCE_H
#define FILEMD5INSTANCE_H#include <QObject>
#include <QMutex>
#include <QDir>
#include <QCryptographicHash>
#include <QFile>
#include <QDebug>
class FileMd5Instance : public QObject
{Q_OBJECT
public:explicit FileMd5Instance();~FileMd5Instance();static FileMd5Instance* instance();void fileMd5(const QDir &dir);void bigFileMd5(const QDir &dir);private:static QMutex *m_pmutex;static FileMd5Instance *m_pinstacne;
};#endif // FILEMD5INSTANCE_H
#include "filemd5instance.h"
QMutex *FileMd5Instance::m_pmutex = new QMutex;
FileMd5Instance *FileMd5Instance::m_pinstacne = nullptr;
FileMd5Instance::FileMd5Instance()
{}FileMd5Instance::~FileMd5Instance()
{}FileMd5Instance *FileMd5Instance::instance()
{if(nullptr == m_pinstacne){m_pmutex->lock();if(nullptr == m_pinstacne){m_pinstacne = new FileMd5Instance;}m_pmutex->unlock();}return m_pinstacne;
}void FileMd5Instance::fileMd5(const QDir &dir)
{QStringList fileList = dir.entryList(QDir::Files, QDir::NoSort);for(int i=0;i<fileList.size();i++){QFile file(dir.path()+"/"+fileList.value(i));file.open(QIODevice::ReadOnly);QByteArray ba = QCryptographicHash::hash(file.readAll(), QCryptographicHash::Md5);file.close();qDebug()<<"fileMd5 file: "<<fileList.value(i)<<" MD5:"<< ba.toHex().constData();}
}void FileMd5Instance::bigFileMd5(const QDir &dir)
{QStringList fileList = dir.entryList(QDir::Files, QDir::NoSort);for(int i=0;i<fileList.size();i++){QFile file(dir.path()+"/"+fileList.value(i));file.open(QIODevice::ReadOnly);QCryptographicHash md5(QCryptographicHash::Md5);qint64 totalBytes = 0;qint64 bytesWritten = 0;qint64 bytesToWrite = 0;qint64 loadSize = 1024 * 4;QByteArray buf;totalBytes = file.size();bytesToWrite = totalBytes;while (1){if(bytesToWrite > 0){buf = file.read(qMin(bytesToWrite, loadSize));md5.addData(buf);bytesWritten += buf.length();bytesToWrite -= buf.length();buf.resize(0);}else{break;}if(bytesWritten == totalBytes)break;}file.close();qDebug()<<"bigFileMd5 file: "<<fileList.value(i)<<" MD5:"<< md5.result().toHex().constData();}
}

三、效果图

客户端软件更新策略 QCryptographicHash相关推荐

  1. 客户端软件更新管理系统

    名称: 客户端软件更新管理系统 摘要: 本发明提供了一种客户端软件更新管理系统,包括设于服务器端的服务端管理模块.设于客户端的客户端更新模块及客户端执行模块.在服务器端与客户端建立连接的服务端接口模块 ...

  2. mac word维吾尔文字体_字加软件更新啦!万款字体一键激活!

    [字加]客户端软件更新啦! 目前MAC版本和WIN版本[字加]都已更新.Mac OS客户端V0.9.9.13,Windows客户端V0.9.9.4. [字加]客户端软件是为设计师量身定做的一款字体获取 ...

  3. 攻击者正在利用mysql程序漏洞_Riddle 漏洞影响 MySQL 客户端软件,MiTM 攻击可致登陆凭证被窃...

    据外媒 15 日报道,安全专家于 2 月在 Oracle 数据库管理系统( DBMS )MySQL 中发现一个被命名为 Riddle 的编码漏洞,允许攻击者利用 MiTM 攻击窃取用户名与密码.目前, ...

  4. wsus服务器推送指定的补丁,【补丁更新】组策略实现WSUS客户端自动更新

    使用组策略来管理 WSUS 自动更新客户端下载.安装和重新启动行为 可以配置 Windows Server Update Services (WSUS) 客户端来提供最符合您的环境和业务需求的更新安装 ...

  5. WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)

    时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码)  已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...

  6. 软件更新服务之客户端更新

    软件更新服务之客户端更新 在现在的软件开发和使用中,软件的更新是很关键的一环.通过不停的更新软件,迭代,给用户带来更好的体验和更多的功能以及修复用户反馈的bug.我们在更新的软件的时候,如果每次都要用 ...

  7. 计算机更新策略,客户端无法更新组策略

    你好,客户端windows 7,服务器windows server 2008.该域部署了多个站点,某些站点部署的是只读域控制器. 客户反馈客户端无法更新组策略,执行gpupdate /force,报错 ...

  8. 软件更新点的配置—SUP

    软件更新点 (SUP) 正如我在上文中提到的,SCCM 中已经不存在目录了.SCCM 改为直接使用专用 Windows Server® Update Services (WSUS) 服务器,该服务器将 ...

  9. 使用Configuration Manager部署及管理软件更新(2)

    承接上一篇文章:http://ericxuting.blog.51cto.com/8995534/1543835 一. 确定软件更新符合性 1. 打开Configuration Manager管理控制 ...

最新文章

  1. 图灵奖公布:高性能计算先驱、为超算铺平道路的Jack Dongarra获奖
  2. 由于授权协议中的一个错误,远程计算机中断了会话
  3. 转载:2016前端开发技术巡礼
  4. WCF创建到使用到发布
  5. Boost:bind绑定的测试自定义占位符
  6. 在ADF 12.2.1.3中使用基于JSON的REST Web服务
  7. 数据结构c语言版总结,数据结构:C语言常见算法总结
  8. 前端学习(171):注释元素
  9. 微信壹佰超级名片小程序源码v1.1.16
  10. Spring自学日志06(Aop)
  11. 【Elasticsearch】一次 排查 iK 分词器 查询慢 分词多 内容大 的问题记录
  12. 想知道你能不能挣到大钱吗?
  13. php微积分难吗,微积分中10大经典问题
  14. 扩展欧几里得算法求逆元c语言,扩展欧几里得算法及求逆元
  15. Python读取pdf无框线表格_Python将PDF数据解析为表格形式
  16. Android 校正系统时间的三种解决方案
  17. python tokenize_model_AttributeError:“module”对象没有属性“tokenize”
  18. 让人心静的七十五条经典修心格言
  19. 【JZOJ A组】Melancholy
  20. 分享一些ABP..ABS的广告过滤规则

热门文章

  1. 如何成为一名「卓越」的数据科学家?
  2. 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像
  3. Calendar类的简单使用
  4. C语言控制台小游戏 | 打飞机
  5. RPA应用场景-报税机器人
  6. HTML5代码可以和jsp混合在一起
  7. 使用MV制作最简单的游戏:我要做游戏(7)
  8. mysql 递归查询 (MySQL 8.0 ETC 递归查询)
  9. 封装自定义Docker镜像
  10. 浏览器的事件循环机制