基于Qt平台QuaZip方式压缩/解压缩
一、前言
最近任务中需要使用文件压缩和解压缩,来保持文件传输的完整性。找到几种开源方式,比较常见的有zlib库,基于zlib封装的libzip库(C++方式),又找打比较适合Qt平台的QuaZip库(也是基于zlib库封装)。
实际编译QuaZip出现了一些问题,网上的文章比较凌乱,没有找到解决办法。没办法只能自己看代码,发现需要定义一些宏才能正常使用,还好,问题解决了。
二、zlib库
- QuaZip依赖zlib,首先需要下载zlib库,下载地址: https://www.zlib.net/fossils/
- 使用CMake工具编译自身平台的zlib动态库,具体如何编译请自行百度。
三、QuaZip库
QuaZip是跨平台的,一个用于处理ZIP文件的C++类库,具体使用方法参考官网:https://quazip.sourceforge.net/
1. 下载QuaZip
下载地址:https://github.com/stachenov/quazip/releases
下载后解压文件,里面的quazip就是我们需要的文件。
2. 生成qt pro文件
打开cmd程序,进入quazip的目录,使用“qmake -project”命令生成quazip的工程文件。
qt工程文件
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.lib和quazip.dll,OK了。
下载地址:https://download.csdn.net/download/sxtdzj/90304807
4. 进阶
我们还可以把上面的pro文件改为pri文件,改为一个子模块,在pri文件定义QUAZIP_STATIC宏,添加到其他程序使用。
四、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示例。
原文地址:https://blog.csdn.net/sxtdzj/article/details/145320060
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!