基于Qt平台QuaZip方式压缩/解压缩

news/2025/1/30 17:11:31/

一、前言

  最近任务中需要使用文件压缩和解压缩,来保持文件传输的完整性。找到几种开源方式,比较常见的有zlib库,基于zlib封装的libzip库(C++方式),又找打比较适合Qt平台的QuaZip库(也是基于zlib库封装)。
  实际编译QuaZip出现了一些问题,网上的文章比较凌乱,没有找到解决办法。没办法只能自己看代码,发现需要定义一些宏才能正常使用,还好,问题解决了。

二、zlib库

  • QuaZip依赖zlib,首先需要下载zlib库,下载地址: https://www.zlib.net/fossils/
  • 使用CMake工具编译自身平台的zlib动态库,具体如何编译请自行百度。
    在这里插入图片描述

QuaZip_7">三、QuaZip

‌  QuaZip是跨平台的,一个用于处理ZIP文件的C++类库,具体使用方法参考官网:https://quazip.sourceforge.net/

QuaZip_9">1. 下载QuaZip

下载地址:https://github.com/stachenov/quazip/releases
下载后解压文件,里面的quazip就是我们需要的文件。
在这里插入图片描述

qt_pro_13">2. 生成qt pro文件

打开cmd程序,进入quazip的目录,使用“qmake -project”命令生成quazip的工程文件。
在这里插入图片描述
qt工程文件
在这里插入图片描述

QuaZip_18">3. 编译QuaZip

  • 使用qt creator软件打开quazip.pro文件,修改生成目标app->lib.
    在这里插入图片描述
  • 拷贝zlib的头文件及lib到quazip工程路径,并在pro文件包含头文件和zlib库。
INCLUDEPATH += $$PWD/zlib/include
contains(DEFINES, WIN64) {LIBS += -L$$PWD/zlib/lib/x64 -lzlib
} else {LIBS += -L$$PWD/zlib/lib/win32 -lzlib
}
  • 尝试编译,发现报错。
    在这里插入图片描述
    然后在quazip_global.h发现了几句话
    在这里插入图片描述
    我们需要再pro文件中根据具体使用情况定义这些宏,才能正常编译。
    我这里需要编译生成VC的动态库,所以定义了QUAZIP_BUILD宏。
    静态库或直接使用代码需要定义QUAZIP_STATIC宏。
    DEFINES += QUAZIP_BUILD

‌ ‌ 再次编译,生成quazip.libquazip.dll,OK了。
‌ ‌ 下载地址:https://download.csdn.net/download/sxtdzj/90304807

4. 进阶

我们还可以把上面的pro文件改为pri文件,改为一个子模块,在pri文件定义QUAZIP_STATIC宏,添加到其他程序使用。

QuaZip_45">四、QuaZip使用

在项目中使用quazip,需要把quazip的头文件及lib到拷贝到使用项目中,并在pro文件添加quazip头文件/库。

1. 简易的文件夹压缩、解压缩

我们使用JlCompress类可以完成简单的文件夹压缩和解压缩功能。

  • 压缩文件夹
    使用JlCompress::compressDir函数将一个文件夹压缩为zip格式的文件。
void Widget::on_pushBtnCompress_clicked()
{QString compDir = ui->lineEditCompDir->text();if (compDir.isEmpty())return;//压缩QDir dir(compDir);if (!dir.exists() || dir.isEmpty())return;QString zipName = QDir::cleanPath(dir.absolutePath() + QDir::separator() + dir.dirName() + ".zip");bool result = JlCompress::compressDir(zipName, dir.absolutePath());if (result){QMessageBox::information(this, tr("提示"), tr("压缩成功!"));}else{QMessageBox::warning(this, tr("警告"), tr("压缩失败!"));}
}
  • 解压文件
    使用JlCompress::extractDir函数解压。
void Widget::on_pushBtnDecompress_clicked()
{QString zipFileName = ui->lineEditDecompDir->text();if (zipFileName.isEmpty())return;if (!QFile::exists(zipFileName))return;QFileInfo zipFileInfo(zipFileName);QString deDirPath = QDir::cleanPath(zipFileInfo.absolutePath() + QDir::separator() + zipFileInfo.completeBaseName());QDir dir(deDirPath);if (!dir.exists()){QDir().mkpath(deDirPath);}//解压QStringList fileList = JlCompress::extractDir(zipFileInfo.absoluteFilePath(), dir.absolutePath());if (!fileList.isEmpty()){QMessageBox::information(this, tr("提示"), tr("解压成功!"));}else{QMessageBox::warning(this, tr("警告"), tr("解压失败!"));}
}

2. 其他方式

参考QuaZip官网及QuaZip源码包中的qztest示例。


http://www.ppmy.cn/news/1567930.html

相关文章

git基础指令大全

版本控制 git管理文件夹 进入要管理的文件夹 — 进入 初始化(提名) git init 管理文件夹 生成版本 .git ---- git在管理文件夹时,版本控制的信息 生成版本 git status 检测当前文件夹下的文件状态 (检测,检测之后就要管理了…

Cline 3.2 重磅更新:免费调用 Claude Sonnet 3.5 和 GPT 4o,开发效率直接拉满!

1. Cline 简介 Cline 是一款结合了 AI 助手与 VS Code 的智能工具,旨在通过其深度集成的能力协助开发者完成复杂的软件开发任务。从创建与编辑文件到执行终端命令,Cline 借助 Claude 3.5 Sonnet 的代理编程能力,将开发者从繁琐的手动任务中解放出来。同时,它通过 Model Co…

JDK15主要特性

JDK 15,也被称为Java 15或Java Platform, Standard Edition 15,是Java编程语言的第十五个主要版本,由Oracle公司在2020年9月发布。Java 15继续了Java平台的快速发布周期,引入了一些新特性和改进。 主要特性 [339]EdDSA数字签名算…

天猫超市卡绑卡 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 headers {"accept&q…

ECMAScript--promise的使用

​ 一、Promise的简介 Promise是一个代理,它所代表的值在创建时并不一定是已知的。借助Promise,我们能够将处理程序与异步操作最终的成功值或者失败原因关联起来。这一特性使得异步方法可以像同步方法那样返回值,不同之处在于异步方法不会立…

基于Django的个人博客系统的设计与实现

【Django】基于Django的个人博客系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统采用Python作为主要开发语言,结合Django框架构建后端逻辑,并运用J…

SpringAI 搭建智能体(二):搭建客服系统智能体

在现代人工智能应用中,智能体(Agent) 是一个重要的概念,它的核心能力是自主性与灵活性。一个智能体不仅能够理解用户的需求,还能拆解任务、调用工具完成具体操作,并在复杂场景中高效运行。在本篇博客中&…

99.17 金融难点通俗解释:归母净利润

目录 0. 承前1. 简述2. 比喻:小明家的小卖部2.1 第一步:计算收到的所有钱2.2 第二步:减去各种支出2.3 第三步:计算能带回家的钱 3. 生活中的例子3.1 好的经营情况3.2 一般的经营情况3.3 不好的经营情况 4. 小朋友要注意4.1 为什么…