1. QuaZip
QuaZip 是一个对 zlib 封装的 C++ 类库,编译时需要依赖zlib库。QuaZip 用于读取和写入 ZIP 归档文件。它提供了一种方便的方式来处理 ZIP 格式的文件,包括创建、读取、添加、提取和修改 ZIP 文件中的内容。
-
压缩和解压缩文件:QuaZip 允许你创建 ZIP 归档文件,并将文件或文件夹添加到 ZIP 中。同时,它也提供了从 ZIP 归档中提取文件的功能,使得你可以解压缩 ZIP 文件并获取其中的内容。
-
文件管理:通过 QuaZip,你可以管理 ZIP 归档中的文件,包括获取文件列表、检查文件是否存在、获取文件的属性等操作。
-
数据存储:ZIP 格式是一种常用的数据存储和传输格式,QuaZip 可以帮助你以 ZIP 格式存储和处理数据,使得数据在传输和存储过程中更加紧凑和便于管理。
-
跨平台兼容性:QuaZip 是跨平台的,可以在多种操作系统上使用,包括 Windows、Linux、macOS 等,因此非常适合需要在不同平台上进行文件处理和数据传输的项目。
总的来说,QuaZip 提供了一个方便、高效的方式来处理 ZIP 归档文件,使得你可以轻松地在你的项目中进行文件压缩、解压缩和管理操作。
1.1 QuaZip 下载
源 | 地址 |
---|---|
官网 | https://quazip.sourceforge.net/ |
GitHub导航页 | https://stachenov.github.io/quazip/ |
GitHub 地址 | https://github.com/stachenov/quazip |
GitHub Release地址 | https://github.com/stachenov/quazip/releases |
souceforge下载 | https://sourceforge.net/projects/quazip/ |
zlib | 持之以恒(三)zlib库 |
编译好的QuaZip库资源 | 【免费】QuaZip编译好的库lib、dll |
QuaZip 依赖 zlib库,使用前应先编译zlib库
2. QuaZip编译与部署
2.1 QuaZip 编译lib、dll
-
quazip下载
-
解压压缩包:quazip-1.4
-
使用CMake-Gui配置路径
-
点击Configure,选择x64
-
报错:Qt5_DIR-NOTFOUND,修改Qt5_DIR路径,本文选择MSVC2019_64框架
按下图修改,再次点击config
-
报错找不到ZLIB相关库
按下图添加zlib库依赖,再次点击config
-
修改QUAZIP_USE_QT_ZLIB为on,再次点击config
OFF 是指支持直接使用QT内置的zlib
ON使用设置依赖的ZILB
-
点击Generate生成vs2019工程
-
点击Open Project,打开VS工程
-
设置QuaZip为启动项目
-
debug x64 / release x64模式下生成编译
2.2 QuaZip 部署与使用
- 创建目录如下
install目录如下
目录 | 说明 | 文件 |
---|---|---|
bin | 存放dll | quazip1-qt5d.dll、quazip1-qt5.dll |
lib | 存放lib | quazip1-qt5d.lib、quazip1-qt5.lib |
include | 存放.h文件 |
- 设置CMAKE_INSTALL_PREFIX变量到指定目录
- 设置INSTALL为启动项目,分别在Debug / Release 模式下进行重新生成,即可得到对应的生成包,如下图所示
3. C++示例
#include <QDir>
#include <QuaZip>
#include <QuaZipFile>
#include <QFile>
void zipDirectory(const QString &dirPath, const QString &zipPath)
{
// 创建 ZIP 文件
QuaZip zip(zipPath);
zip.setFileNameCodec("UTF-8");
if (!zip.open(QuaZip::mdCreate))
{
qDebug() << "Failed to create ZIP file:" << zipPath;
return;
}
// 遍历文件夹并添加文件到 ZIP 文件中
QDir dir(dirPath);
QStringList files = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
foreach (QString fileName, files)
{
QString filePath = dirPath + QDir::separator() + fileName;
QuaZipFile zipFile(&zip);
if (!zipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileName, filePath)))
{
qDebug() << "Failed to add file to ZIP:" << filePath;
zip.close();
return;
}
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly))
{
qDebug() << "Failed to open file:" << filePath;
zipFile.close();
zip.close();
return;
}
zipFile.write(file.readAll());
zipFile.close();
}
// 关闭 ZIP 文件
zip.close();
// 复制 ZIP 文件到指定目录
QString destPath = "/path/to/destination/directory/" + QFileInfo(zipPath).fileName();
if (!QFile::copy(zipPath, destPath))
{
qDebug() << "Failed to copy ZIP file to destination directory:" << destPath;
return;
}
}