客户端软件更新策略 QCryptographicHash 网络模块(三)

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

  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();
    }
}

三、效果图
在这里插入图片描述
在这里插入图片描述

发布了30 篇原创文章 · 获赞 1 · 访问量 1143

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/104877962