自学内容网 自学内容网

基于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.libquazip.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)!