一、QuaZIP是什么

QuaZIP is a simple C++ wrapper over Gilles Vollant’s ZIP/UNZIP package that can be used to access ZIP archives. It uses the Qt toolkit.

二、如何编译

2.1、使用CMake编译

首先要知道的一件事:quazip是对zlib的封装,需要依赖zlib库的。直接使用CMake编译的话会遇到zlib库的路径问题:

遇到问题:

CMake提示:Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)

解决方案:

注意到 https://github.com/stachenov/quazip 下载的压缩包里面,有个文件 NEWS.txt

QuaZip changes

* 2021-11-13 1.2
* Add CMake option to disable installation (Sebastian Rettenberger)
* Qt's internal zlib can be used now (QUAZIP_USE_QT_ZLIB, OFF by
default)
* Make tests optional (QUAZIP_ENABLE_TESTS, OFF by default)
(Gleb Ignatev)
* Fix: QuaZip::close() can be safely called multiple times now
* Fix: -lz added to pkgconfig

其中 Qt’s internal zlib can be used now (QUAZIP_USE_QT_ZLIB, OFF bydefault),意思是说,支持直接使用QT内置的zlib。

  • A、修改 CMakeLists.txt 中的 option(QUAZIP_USE_QT_ZLIB “” OFF),为option(QUAZIP_USE_QT_ZLIB “” ON)
  • B、再使用CMake(带gui界面的)根据需要配置一下,配置完毕会生成 QuaZip.sln
  • C、编译QuaZip.sln,结束后就可以得到 quazip1-qt5.dll

2.2、手动新建quazip工程

  • A、下载zlib,地址:http://www.zlib.net/
  • B、编译zlib,直接cmake编译即可
  • C、新建quazip的vs工程(qt),把quazip压缩包的文件都搬到新建的工程,然后把zlib以第三方库的形式配置到quazip工程
  • D、编译quazip.sln工程,最后得到 quazip.dll

C/C++ > 常规 > 附加包含目录:./zlib-1.2.11/include/

C/C++ > 预处理 > 预处理定义:QUAZIP_BUILD

链接器 > 常规 > 附加库目录: ./zlib-1.2.11/lib/x86/

链接器 > 输入 > 附加依赖项:zlibd.lib

需要注意的是,quazip.dll 需要依赖 zlib.dll,所以在用到的地方需要把zlib.dll一并带上,而使用 quazip1-qt5.dll,则不需要。

三、Sample

#include <QtCore/QCoreApplication>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QDateTime>
#include <QDebug>
#include <QElapsedTimer>
#include <QJsonDocument>
#include <QJsonObject>
#include "JlCompress.h" int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv); QString zipName = QString("%1%2").arg("./download/").arg("package.zip");
QString unzipDir = "./unzip_dir";
QDir dir(unzipDir);
if (!dir.exists())
{
bool okey = dir.mkdir(unzipDir);
//bool okey = dir.mkpath(unzipDir);
QString tip = QString("mkpath %1,%2").arg(unzipDir).arg(okey);
qDebug() << tip;
} QElapsedTimer timer;
timer.start();
QStringList files = {};
QFileInfo fileInfo(zipName);
if (fileInfo.exists())
{
files = JlCompress::extractDir(zipName, unzipDir);
}
qDebug() << "files count:" << files.size();
qDebug() << "the operation(JlCompress::extractDir) took" << timer.elapsed() << "ms"; QVariantMap NameAndPathMap;
// 这里解压出来后的文件是按照文件名排序的
foreach(QString fileItem, files)
{
QString fileName = QFileInfo(fileItem).fileName();
qint64 fileSize = QFileInfo(fileItem).size();
qDebug() << "Name:" << fileName << "Size:" << fileSize << "\tPath:" << fileItem;
//
NameAndPathMap.insert(fileName, fileItem);
} //save to file
QJsonObject root = QJsonObject::fromVariantMap(NameAndPathMap);
QString content = QString(QJsonDocument(root).toJson(QJsonDocument::Indented/*Compact*/));
//
QFile writer("./content.json");
if (writer.open(QIODevice::WriteOnly))
{
writer.write(content.toUtf8());
writer.close();
}
qDebug() << "over!!!";
return a.exec();
}

四、踩过的坑

编译了zlib后,在环境变量里面都添加了 ZLIB_LIBRARYZLIB_INCLUDE_DIR,但是在CMake 配置quazip时,都没有生效。

至于网上有些使用cmake命令构建,我没过试过,例如:

cmake .. -DZLIB_INCLUDE_DIR=E:\zlib\zlib-1.2.11 -DZLIB_LIBRARY=E:\zlib\zlib-1.2.11\zlibstaticd.lib

有兴趣有时间的童鞋可以尝试一下。

【3rd_Party】使用QuaZip进行压缩和解压缩文件的更多相关文章

  1. Qt中用QuaZip来压缩和解压缩文件

    1.简介 QuaZIP是使用Qt,C++对ZLIB进行简单封装的用于压缩ZIP以及解压缩ZIP的开源库.如果你的Qt项目当中用到了压缩以及解压缩ZIP的话你可以考虑选择使用它. 官方主页:http:/ ...

  2. Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

    1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件   ...

  3. [Java 基础] 使用java.util.zip包压缩和解压缩文件

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

  4. 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期

    [源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...

  5. IOS开发之网络编程--文件压缩和解压缩

    前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...

  6. 在C#中利用SharpZipLib进行文件的压缩和解压缩收藏

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipL ...

  7. iOS中使用ZipArchive压缩和解压缩文件-备

    为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用 ...

  8. IO操作之使用zip包压缩和解压缩文件

    转自:http://www.cdtarena.com/java.html​​Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...

  9. Java用ZIP格式压缩和解压缩文件

    转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...

  10. 使用commons-compress操作zip文件(压缩和解压缩)

    http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...

随机推荐

  1. 每日总结9.20-phoenix的连接

    今天连了phoenix 出现了好多问题,欸 一点点解决,看那个电脑我头都要晕了,jar包和xml文件的问题,总之是解决了 怎么办,我还不会springboot,好多人都学了,我害怕.大家怎么都这么努力 ...

  2. 【Javaweb】Servlet六 | HttpServletRequest类的含义及其使用方法【详解】

    HttpServletRequest类的作用 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中.然后传递到Service方法(d ...

  3. 通过Span实现高性能数组,实例解析

    Span<T> 是 C# 7.2 引入的一个强大的数据结构,用于表示内存中的一块连续数据.它可以用于实现高性能的数组操作,而无需额外的内存分配.在本文中,我将详细介绍如何使用 Span&l ...

  4. MySQL8.0 安装教程

    一.下载 1.官网地址 MySQL :: Download MySQL Community Server 2.选择安装包安装方式 3.选择安装版本 4.开始下载 5.下载成功 二.安装 1.双击安装包 ...

  5. 【译】使用 GitHub Copilot 编写 Git 提交

    在花费数小时修复 bug 或更新特性之后,我们开发人员最不愿意做的事情往往是仔细说明 Git 提交的内容.最新的 Visual Studio 预览版可以帮到您.使用新的生成 Git 提交消息特性来帮助 ...

  6. 使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理

    在前面随笔<在Winform应用中增加通用的业务编码规则生成>,我介绍了基于Winform和WPF的一个通用的业务编码规则的管理功能,本篇随笔介绍基于后端Web API接口,实现快速的Vu ...

  7. flask蓝图(这玩意就是django的子应用)

    蓝图的概念类似django的子应用,作用就是分模块开发,有关联的都放在一起. 蓝图的创建步骤: 新建一个包(一个包就是一个模块.等同于一个子应用) 在包的__init__.py中创建蓝图对象 . 蓝图 ...

  8. DRF过滤器

    https://www.django-rest-framework.org/api-guide/filtering 一般情况下,我们可以重写DRF视图类的get_queryset()方法来实现查询结果 ...

  9. Python 潮流周刊第 33 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  10. Python——第二章:range()的用法:

    在Python中,range()是一个内置函数,用于生成一个整数序列,通常用于循环遍历.以下是range()函数的一些常见用法: range(n): 从0数到n. 不包含nrange(m, n): 从 ...