Qt压缩和解压文件的使用及案例QuaZip,100%能运行

前言

在Qt中进行压缩和解压缩操作,您可以使用以下几种第三方库:

 1.Quazip

  QuaZIP是一个使用Qt和C++封装ZLIB的库,专门用于压缩和解压缩ZIP文件。它支持压缩和解压缩单个文件、多个文件以及整个目录,并且可以处理ZIP文件内的文件信息。QuaZIP是一个流行的选择,因为它易于集成到Qt项目中,并且提供了丰富的API来处理压缩文件. 

2.JlCompress

  JlCompress是一个用于处理压缩文件的库,它能够处理包括7z在内的多种压缩格式。这个库提供了一系列的静态方法来压缩和解压缩文件,使其成为Qt环境中处理压缩文件的有力工具。

3.Zlib

Zlib是一个广泛使用的开放源代码库,提供了无损数据压缩和解压缩功能。虽然Qt本身并不直接提供Zlib的接口,但您可以将Zlib库集成到Qt项目中,并使用其提供的qCompressqUncompress函数进行基本的压缩和解压缩操作

如何在Qt项目中使用这些库 三步走

我这里是创建了一个小项目Quazip

1.第一步: 下载和安装库   

从相应的资源下载所需的库文件,并将它们放置在您的项目结构中。

这里为大家提供这三种库的下载链接:点我下载 里面有我们需要的头文件及库文件

链接: https://pan.baidu.com/s/1s0IoFCj309QYVi9wayHPNA 提取码: xhyq

2.第二步:配置.pro文件,编译链接库文件

这里采用的是动态链接库文件

把下载好的文件放入创建好的项目目录里:

并且在项目的.pro文件中添加库的路径和链接指令。如图

代码如下:

LIBS += -L$$PWD/third_party/quazip/dll -lquazip
LIBS += -L$$PWD/third_party/zlib/dll -lzlib1
LIBS += -L$$PWD/third_party/dll -lws2_32


其中 `$$ PWD` 是当前工作目录的路径,`-L` 后跟库文件的路径,`-l` 后跟库文件名(不含文件扩展名)。

3.第三步:执行qmake 然后添加头文件

右击项目文件点执行qmake

然后  根据使用需要包含库文件,我提供的下载文件不止这几个头文件,我这儿举个例子 

接下来就可以使用这些库提供的api  开始愉快的写代码时光啦 哈哈哈哈哈哈

案例

这里我就介绍一下JlCompress库的案例吧,这个库蛮好用的,提供了现成的静态方法去压缩和解压缩文件或者压缩文件目录都可以,这样我们就不用自己去封装一些方法去压缩解压缩,这样子不仅安全还不容易出错。

1.压缩解压缩单个文件 

 压缩单个文件的方法

函数原型

static bool JlCompress::compressFile(
const QString &fileCompressed,
 const QString &file);
  • fileCompressed: 压缩后文件的名称。
  • file: 要压缩的原始文件的路径。
   QString fileName = QFileDialog::getOpenFileName(this,"打开文件","D:/","Files()*.json");

    QString compressedFile = "D:/a/a.7z"; // 这里是我们压缩后的文件存放地址,后缀名可以自己定义
    bool success = JlCompress::compressFile(compressedFile,fileName);

    if (success) {
        qDebug() << "File compressed successfully.";
    } else {
        qDebug() << "Failed to compress file.";
    }
}

执行后结果:压缩成功保存到D盘a目录下

解压缩压缩包中单个文件方法

函数原型:

static QString JlCompress::extractFile(
const QString &fileCompressed, 
const QString &fileName,
const QString &fileDest = QString());
  • fileCompressed: 压缩文件的名称。
  • fileName: 要从中提取的文件的名称。
  • fileDest: 可选参数,指定提取到的目标文件路径。如果省略此参数,默认提取到当前工作目录。
QString extractedFilePath = JlCompress::extractFile("D:/a/a.7z", "example.json", "D:/a");
if (!extractedFilePath.isEmpty()) {
    // 提取成功
    qDebug() << "File extracted successfully:" << extractedFilePath;
} else {
    // 提取失败
    qDebug() << "Failed to extract file." << JlCompress::getZipError();
}

运行后成功解压缩:

2.压缩解压缩整个目录

压缩目录下的所有文件

函数原型:

static bool JlCompress::compressDir(
 const QString &fileCompressed,
 const QString &dir = QString(), 
 bool recursive = true);
  • fileCompressed: 压缩后文件的名称。
  • dir: 要压缩的目录的路径。
  • recursive: 可选参数,指示是否递归地压缩子目录。默认为 true

代码:

 bool result = JlCompress::compressDir("D:/b/compress.zip", "D:/a", true);
    if (result) {
        // 成功
        qDebug() << "File compressed successfully:" ;
    } else {
        // 失败
        qDebug() << "Failed to compress file.";
    }

运行成功:

解压缩压缩包中的所有文件

函数原型:

static QStringList JlCompress::extractDir(
 const QString &fileCompressed,
 const QString &dir = QString());
  • dir: 可选参数,指定提取到的目标目录路径。如果省略此参数,默认提取到当前工作目录。
  • fileCompressed: 压缩文件的名称。
  • 如果提取操作成功,该函数返回包含所有提取文件路径的 QStringList;如果失败,返回空列表。

代码:

  QStringList extractedFiles = JlCompress::extractDir("D:/b/compress.zip", "D:/r");
    if (!extractedFiles.isEmpty()) {
        // 提取成功
        foreach (const QString &file, extractedFiles) {
            qDebug() << "File extracted:" << file;
        }
    } else {
        // 提取失败
        qDebug() << "Failed to extract directory.";
    }

运行成功:

好了,希望大家也能成功运行,看完能帮助到你们

  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用QByteArray和QFile类来处理zlib压缩文件解压缩操作。以下是一个简单的示例代码: ```cpp #include <QByteArray> #include <QFile> #include <zlib.h> bool decompressFile(const QString &sourceFile, const QString &destinationFile) { QFile inputFile(sourceFile); if (!inputFile.open(QIODevice::ReadOnly)) return false; QFile outputFile(destinationFile); if (!outputFile.open(QIODevice::WriteOnly)) return false; QByteArray inputBuffer = inputFile.readAll(); QByteArray outputBuffer; outputBuffer.resize(1024); z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = inputBuffer.size(); stream.next_in = (Bytef *)(inputBuffer.constData()); stream.avail_out = outputBuffer.size(); stream.next_out = (Bytef *)(outputBuffer.data()); if (inflateInit(&stream) != Z_OK) return false; int result = Z_OK; while (result == Z_OK) { result = inflate(&stream, Z_NO_FLUSH); switch (result) { case Z_STREAM_END: break; case Z_NEED_DICT: result = Z_DATA_ERROR; case Z_DATA_ERROR: case Z_MEM_ERROR: inflateEnd(&stream); return false; } if (outputFile.write(outputBuffer, stream.total_out) == -1) { inflateEnd(&stream); return false; } stream.avail_out = outputBuffer.size(); stream.next_out = (Bytef *)(outputBuffer.data()); } outputFile.close(); inputFile.close(); inflateEnd(&stream); return true; } ``` 在这个示例中,我们首先打开了需要解压文件解压后的目标文件。然后,我们读取整个输入文件并将其存储在QByteArray变量中。接下来,我们创建了一个z_stream结构体,并将其初始化为使用zlib库进行解压缩操作。然后,我们通过调用inflateInit()函数来初始化解压缩操作。接下来,我们使用while循环来逐步解压缩输入数据,并将解压缩后的数据写入输出文件。最后,我们调用inflateEnd()函数来释放z_stream结构体所占用的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值