QT案例 Qt Creator 使用QuaZIP加密压缩解压ZIP文件

news2024/9/25 17:20:46

QT开发中部分项目可能会涉及对项目数据的一些指定文件的打包压缩以及指定目录下的解压,此时也需要对数据数据进行加密以确保数据的安全性。此时就可以使用Quazip实现相关功能。
QuaZIP是使用Qt,C++对ZLIB进行简单封装的用于压缩ZIP以及解压缩ZIP的开源库。
可执行程序示例

目录

  • 软件版本
  • 一、编译zlib-1.2.13
    • 使用Mingw 64位编译
  • 二、编译Quazip
    • MinGW 编译器引用
    • Msvc 编译器引用
    • 直接引用 QuaZip项目
      • MSCV编译器
      • Mingw编译器
  • 三、无密码设置 直接 使用JlCompress 加密解压
  • 四、设置密码,加密数据
  • 五、根据密码,解密数据
  • 六、注意事项
  • 七、源码下载

软件版本

开发软件:Qt Creator 5.13.1
使用库:zlib-1.2.13 QuaZIP

一、编译zlib-1.2.13

zlib-1.2.13源码下载:http://www.zlib.net/

使用Mingw 64位编译

再开始菜单中找到 MinGW 7.3.0 64-bit编译器
在这里插入图片描述
跳转文件目录 执行:

//具体查看编译流程建议查看 https://blog.csdn.net/u014213012/article/details/108078454
copy win32\Makefile.gcc makefile.gcc
mingw32-make -f makefile.gcc

在这里插入图片描述
MinGW32编译方式一致,只是选择编译器不一样。MSVC 2015/2017等自带zlib无需编译,只是需要引用路径;如果没有也可以直接编译

二、编译Quazip

源码下载 https://sourceforge.net/projects/quazip/ 版本:quazip-0.7.3.zip

MinGW 编译器引用

在Quazip文件目录下创建一个zlib文件夹
在这里插入图片描述
文件目录如下,需要的文件从编译的[zlib-1.2.13]文件夹中查找:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在quazip的pro文件中插入一下代码,在重新生成:

INCLUDEPATH += $$PWD/zlib/include
LIBS += -L $$PWD/zlib/lib/ -lzlib1

在这里插入图片描述

Msvc 编译器引用

直接在pri文件设置qtzlib路径,在进行生成
在这里插入图片描述

直接引用 QuaZip项目

MSCV编译器

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../quazip/release/ -lquazip
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../quazip/debug/ -lquazip
else:unix: LIBS += -L$$OUT_PWD/../quazip/ -lquazip

INCLUDEPATH += $$PWD/../quazip
DEPENDPATH += $$PWD/../quazip
INCLUDEPATH +=  D:\Qt\Qt5.13.1\5.13.1\msvc2017_64\include\QtZlib

Mingw编译器

///Mingw
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../quazip/release/ -lquazip
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../quazip/debug/ -lquazip
else:unix: LIBS += -L$$OUT_PWD/../quazip/ -lquazip

INCLUDEPATH += $$PWD/../quazip
INCLUDEPATH +=  $$PWD/../quazip/zlib/include
DEPENDPATH += $$PWD/../quazip
DEPENDPATH +=  $$PWD/../quazip/zlib/include

三、无密码设置 直接 使用JlCompress 加密解压

#include <JlCompress.h>
#include "quazip.h"
#include "quazipfile.h"
#include "quazipfileinfo.h"
///开始压缩
///使用自带默认函数
///Zip_To_Path zip保存路径
///Project_Path 需要压缩的文件夹路径
JlCompress::compressDir(Zip_To_Path, Project_Path);

///开始解压
///Zip_Form_Path Zip路径
///Unzip_To_Path 解压保存文件夹路径
JlCompress::extractDir(Zip_Form_Path, Unzip_To_Path);

四、设置密码,加密数据

通过对JlCompress::compressDir 方法的解析,加密是需要对写入的每一个文件进行加密:

///实际开发中可能还需要对文件进行筛选 ,将筛选后的文件路径添加至Filelist QStringList
/// 循环写入 也可以设置进度条 直观显示进度
QFile file(Filelist[i]);
if(file.open(QIODevice::ReadOnly))
 {
     QString filename=Filelist[i].replace(parentDir+"/","");
     QuaZipNewInfo newInfo(filename);
     QByteArray array=file.readAll();
     QuaZipFile Zipfile(zip);
     bool ret = Zipfile.open(QIODevice::WriteOnly,
                          newInfo,      // QuaZipNewInfo结构体引用
                          PassWord.toUtf8().constData(),    // 密码
                          0,            // CRC值(默认值是0)
                          8);          // 写入方法(0为文件夹,8为普通文件)

     if(ret)
     {
         Zipfile.write(array);
     }
     file.close();
 }

五、根据密码,解密数据

需要将
copyData2(QIODevice &inFile, QIODevice &outFile)
removeFile(QStringList listFile)
extractFile(QuaZip
zip, QString fileName, QString fileDest)
*
三个方法提取处理重新修改:

///原函数不变
bool copyData2(QIODevice &inFile, QIODevice &outFile)
{
    while (!inFile.atEnd()) {
        char buf[4096];
        qint64 readLen = inFile.read(buf, 4096);
        if (readLen <= 0)
            return false;
        if (outFile.write(buf, readLen) != readLen)
            return false;
    }
    return true;
}

///原函数不变
bool removeFile(QStringList listFile) {
    bool ret = true;
    // Per ogni file
    for (int i=0; i<listFile.count(); i++) {
        // Lo elimino
        ret = ret && QFile::remove(listFile.at(i));
    }
    return ret;
}

///修改添加密码 以及指针定位
bool ::extractFile(QuaZip* zip, QString fileName, QString fileDest)
{
    if (!zip) return false;
    if (zip->getMode()!=QuaZip::mdUnzip) return false;

    // Apro il file compresso
    if (!fileName.isEmpty())
        zip->setCurrentFile(fileName);



    QuaZipFile inFile(zip);
    if(!inFile.open(QIODevice::ReadOnly, PassWord.toUtf8().constData())
            || inFile.getZipError()!=UNZ_OK) return false;

    // Controllo esistenza cartella file risultato
    QDir curDir;
    if (fileDest.endsWith('/')) {
        if (!curDir.mkpath(fileDest)) {
            return false;
        }
    } else {
        if (!curDir.mkpath(QFileInfo(fileDest).absolutePath())) {
            return false;
        }
    }

    QuaZipFileInfo64 info;
    if (!zip->getCurrentFileInfo(&info))
        return false;

    QFile::Permissions srcPerm = info.getPermissions();
    if (fileDest.endsWith('/') && QFileInfo(fileDest).isDir()) {
        if (srcPerm != 0) {
            QFile(fileDest).setPermissions(srcPerm);
        }
        return true;
    }

    // Apro il file risultato
    QFile outFile;
    outFile.setFileName(fileDest);
    if(!outFile.open(QIODevice::WriteOnly)) return false;

    // Copio i dati
    if (!copyData2(inFile, outFile) || inFile.getZipError()!=UNZ_OK) {
        outFile.close();
        removeFile(QStringList(fileDest));
        return false;
    }
    outFile.close();

    // Chiudo i file
    inFile.close();
    if (inFile.getZipError()!=UNZ_OK) {
        removeFile(QStringList(fileDest));
        return false;
    }

    if (srcPerm != 0) {
        outFile.setPermissions(srcPerm);
    }
    return true;
}

读取文件解压数据:

///Zip_Form_Path zip文件所在
QuaZip* zip=new QuaZip(Zip_Form_Path);
 if(!zip->open(QuaZip::mdUnzip))
  {
      emit load_pbarvalue(0,100,"不能打开ZIP文件:"+Unzip_To_Path);
      delete zip;
      emit isStart(false);
      return ;
  }
  ///获取所有文件列表
  /// QList<QPair<文件目录级,文件绝对路径>> extracted
  QList<QPair<QString ,QString >> extracted;
  ///定位第一个文件
  zip->goToFirstFile();
  do {
      QString name = zip->getCurrentFileName();
      QString absFilePath = SaveDir.absoluteFilePath(name);
      extracted.append(QPair<QString ,QString >(name,absFilePath));
  } while (zip->goToNextFile());
 ///正在读取压缩文件中文件列表! 用于进度条显示

  for(int i=0;i<extracted.count();i++)
  {
      ///解压文件
      extractFile(zip, extracted[i].first, extracted[i].second);
  }
  zip->close();
  delete zip;

六、注意事项

1.打包exe时需要将quazip.dll与zlib1.dll放在exe同一目录中
参考连接:
1. QT——QUAZIP的压缩和解压
2. Quazip解压缩文件
3.QT 编译zlib
4.windows qt5.12.0mingw下编译zlib quazip动态库

七、源码下载

可执行程序示例
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive表-----数据清洗

以下内容所需要的环境 &#xff1a;hive 、beeline、Zeppelin&#xff08;可视化界面如何操作表格&#xff09; 一、准备表格 1、上传csv表格至linux目录中 百度网盘自取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1xd5MdXiBDLBUtP07kpgl5Q?pwd2ema 提取码&…

python+appium+夜神模拟器(app抓包爬虫)

安装模块 pip install appium-python-client 安装andriodSDK 官网下载&#xff1a;https://android-sdk.en.softonic.com/download 自动下载一个压缩包&#xff0c;解压后就是一个文件夹放各种需要的文件&#xff0c;将解压的路径配置到环境变量中。 然后添加到path中。 下…

带你了解“函数递归”

目录 1. 什么是递归&#xff1f; 2. 函数递归的必要条件 2.1 接收一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。 代码如下&#xff1a; 2.2 编写一个函数&#xff0c;不用临时变量求字符串长度 代码如下&#xff1a; 2.3 递归与迭代 …

爬虫之Selenium,Phantomjs,Chrome handless

爬虫之模拟浏览器前言1. Selenium1.1 Selenium介绍1.2 安装selenium1.3 Selenium访问京东1.4 Selenium元素定位1.5 seleniu访问元素信息1.6 selenium交互2. Phantomjs2.1 介绍Phantomjs2.1 使用Phantomjs3. Chrome handless3.1 Chrome handless的系统要求3.2 Chrome handless的…

STM32 E18-D80NK红外检测

本文代码使用 HAL 库。 文章目录前言一、E18-D80NK 红外传感器&#xff1a;1. E18-D80NK 的介绍2. 电器特性二、红外检测小实验代码讲解三、实验现象总结前言 这篇文章介绍 如何使用 STM32 控制 E18-D80NK 进行红外检测。 一、E18-D80NK 红外传感器&#xff1a; 1. E18-D80N…

Qt学习笔记-Qt程序中的调试日志

Qt学习笔记-Qt程序中的调试日志环境说明Qt程序中调试日志使用案例对于一门好的编程语言或者开发框架来说&#xff0c;便捷的调试日志功能是必不可少的。QT作为一个跨平台的开发工具&#xff0c;内置了便捷的调试日志功能&#xff0c;本文就对其做一个简介。环境说明 操作系统&…

测试好工具fiddler,手机抓包,查看手机app请求了哪些接口

领导让我接收一个项目&#xff0c;但是这个项目是安卓的&#xff0c;安卓我一窍不通&#xff0c;我们只做过web页面的。身为一个大数据程序员&#xff0c;要接手同事的项目&#xff0c;给我了代码&#xff0c;但是我完全不知道&#xff0c;这个代码对应&#xff0c;安卓机里面的…

Serverless 时代开启,云计算进入业务创新主战场

作者&#xff1a;于洪涛 “我们希望让用户做得更少而收获更多&#xff0c;通过 Serverless 化&#xff0c;让企业使用云服务像用电一样简单。” Serverless 化正在成为全新的软件研发范式&#xff0c;阿里云将坚定推进核心产品全面 Serverless 化&#xff0c;帮助客户更好的实现…

Jetpack Compose 深入探索系列五:State Snapshot System

Jetpack Compose 有一种特殊的方式来表示状态和传播状态变化&#xff0c;从而驱动最终的响应式体验&#xff1a;状态快照系统&#xff08;State snapshot system&#xff09;。这种响应式模型使我们的代码更加强大和简洁&#xff0c;因为它允许组件根据它们的输入自动重组&…

Zookeeper3.5.7版本——Zookeeper的概述、工作机制、特点、数据结构及应用场景

目录一、Zookeeper的概述二、Zookeeper的工作机制三、Zookeeper的特点四、Zookeeper的数据结构五、Zookeeper的应用场景5.1、统一命名服务5.2、统一配置管理5.3、统一集群管理5.4、服务器动态上下线5.5、软负载均衡一、Zookeeper的概述 Zookeeper 是一个开源的分布式的&#x…

飞桨全量支持业内AI科学计算工具——DeepXDE!

AI技术在跨学科融合创新方面扮演着日益重要的角色&#xff0c;特别是在Al for Science领域&#xff0c;AI技术的发展为跨学科、跨领域的融合创新带来了巨大的机会。AI已成为一个关键的研究工具&#xff0c;改变了基础科学的研究范式。依托AI技术开发的科学计算工具&#xff0c;…

【教学类-07-06】20230302《破译电话号码-图形篇(图形固定列不重复)》(两款输入版)

效果展示1、适合中班默写学号——有姓名 有班级&#xff0c;无学号&#xff0c;适合中班幼儿2、适合大班幼儿默写名字——有学号&#xff0c;有班级&#xff0c;无姓名&#xff0c;适合初学者描字&#xff08;小班、中班、大班&#xff09;——名字、学号、班级都有&#xff08…

Java面试总结(三)

类加载的流程 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。 如果想要详细了解类加载的过程&#xff0c;可以参考我…

【同步工具类:CyclicBarrier】

同步工具类:CyclicBarrier介绍源码分析CyclicBarrier 基于ReetrantLock Condition实现。构造函数await() 函数业务场景方案一:代码实现测试截图方案二代码实现测试打印总结介绍 官方介绍: 一种同步辅助工具&#xff0c;允许一组线程都等待对方到达共同的障碍点。CyclicBarrie…

完全彻底卸载Oracle

一、停止使用Oracle的服务停用oracle服务&#xff0c;进入计算机管理&#xff0c;在服务中&#xff0c;找到oracle开头的所有服务&#xff0c;右击选择停止。二、打开Universal Installer工具运行卸载Oracle数据库程序&#xff08;1&#xff09;、一般情况运行Oracle自带的卸载…

代谢组学:Microbiome又一篇!绘制重症先天性心脏病新生儿肠道微生态全景图谱

文章标题&#xff1a;Mapping the early life gut microbiome in neonates with critical congenital heart disease: multiomics insights and implications for host metabolic and immunological health 发表期刊&#xff1a;Microbiome 影响因子&#xff1a;16.837…

热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会

酒事有鲤&#xff08;济南&#xff09;品牌管理有限公司是一家致力于将世界顶级精酿啤酒技术和理念与“ 在地”文化有机融合&#xff0c;做世界认 可的多元化好啤酒&#xff0c;通过精致 舒适的家门口酒馆&#xff0c;让啤酒的 世界观更为完整。 中国生物发酵产业协会联合齐鲁…

Gitlab普通用户转管理员

GitLab是常用的分部式代码库版本开源软件&#xff0c;默认系统中只有一个管理员。在工作中&#xff0c;如果有多个项目&#xff0c;则需要多个管理员分别管理各个的代码仓库&#xff0c;需要把多个普通用户配置成管理员&#xff0c;在Gitlab页面上&#xff0c;不能直接通过操作…

【编程基础之Python】7、Python基本数据类型

【编程基础之Python】7、Python基本数据类型Python基本数据类型整数&#xff08;int&#xff09;基本的四则运算位运算比较运算运算优先级浮点数&#xff08;float&#xff09;布尔值&#xff08;bool&#xff09;字符串&#xff08;str&#xff09;Python数据类型变换隐式类型…

tensorflow2.4--2.回归问题分析

文章目录前言流程案例操作前言 流程 回归问题预测连续值,在某个区间内变动. 常见的线性回归问题模型是yaxb,然而现实世界由于大量的数据偏差以及复杂度,同时还有大量的噪声,往往达不到如此的精确解,实际解决问题时需要考虑噪声的存在 对于噪声,往往我们已经假设了它符合高斯…