Qt开发(1)——解压缩文件的多种方式总结

一、QProcess + 7z

优点

执行外部进程,WinRAR和7zip都可以

缺点

依赖外部的压缩工具

实现

(1) 导入库文件
将7z.dll 和7z.exe放到工程目录下

(2) 压缩

void zipFolder(const QString& path)
{
    QString sourcePath = path + "/compressFolder";
    QDir sourceFolderDir(sourcePath);
    if (!sourceFolderDir.exists())  return;
    
    QString binPath = "C:/";    // 替换成7z.exe实际所在文件夹位置
    QString destinationFolder = "D:/";
    QString zipName = "zipFold_2023";
    QString arguments{"a", destinationFolder + "/" + zipName, sourcePath};
    
    QProcess process;
    process.start(binPath + "/7z.exe", arguments);
    process.waitForFinished();
}

(3) 解压缩

void unZipFolder(const QString& filePath)
{
    if (!QFile::exists(filePath))   return;
    QString binPath = "C:/";    // 替换成7z.exe实际所在文件夹位置
    QString destinationPath = "D:/";
    QStringList arguments{ "x", "-o" + destinationPath, filePath, "-r", "-aoa" };
    QProcess process;
    process.start(binPath + "/7z.exe", arguments);
    process.waitForFinished();
}

(4) 检查库文件是否存在
在调用7z.exe之前,最好检查一下库文件是否存在

void checkDepends(const QString& binPath)
{
    QStringList depends{"7z.exe", "7z.dll"};
    for(const QString& file : depends){
        QString strFile = binPath + "/" + file;
        if (!QFile::exists(strFile)) {
            qWarning() << "missing dependency library" << strFile;
            return;
        }
    }
    return;
}

二、qCompress

优点

Qt自带的api, 使用方便

缺点

将文件压缩为特殊格式,不能直接用WinRAR,7zip来解压,只能通过qUncompress解压读取

实现

(1) 头文件

#include <QByteArray>
#include <QDebug>
#include <QFile>
#include <QIODevice>

(2) 压缩


void Widget::zip()
{
 
    QFile file("E:/1.bmp");
    file.open(QIODevice::ReadOnly);
    qint64 length = file.size();
    QByteArray buff;
    buff = file.read(length);
    file.close();
    buff = qCompress(buff, 5);
    QFile write("E:/1.data");
    write.open(QIODevice::WriteOnly);
    write.write(buff);
    write.close();

(3) 解压缩

void Widget::unzip()
{
    QFile read("E:/1.data");
    read.open(QIODevice::ReadOnly);
    QByteArray data;
    data = read.readAll();
    read.close();
    data = qUncompress(data);
    QFile temp("E:/1.bmp");
    temp.open(QIODevice::WriteOnly);
    temp.write(data);
    temp.close();

三、Qzipwriter

优点

Qt自己的库,生成zip格式

缺点

在 pro 文件中,添加“QT += gui-private”

实现

(1) 修改pro文件

QT       += gui-private

(2) 导入头文件

#include <private/qzipwriter_p.h>
#include <private/qzipreader_p.h>

(3) 压缩

void zipWriter(QString path)
{
    QZipWriter *writer = new QZipWriter(path + "/test.zip");
    //添加文件夹
//    writer->addDirectory(path + "/ss");
    //添加文件
    QFile file(path + "/test.txt");
    if (!file.exists())
    {
        return;
    }
    file.open(QIODevice::ReadOnly);
    writer->addFile("test.txt", file.readAll());
    file.close();
    writer->close();
}

(4) 解压

void zipReader(QString path)
{
    QZipReader reader(path + "/test.zip");
    reader.extractAll(path);
 
    QFile file(path);
    file.open(QIODevice::WriteOnly);
    file.write(reader.fileData(QString::fromLocal8Bit("%1").arg(path + "/Desktop")));
    file.close();
    reader.close();
}

四、QuaZIP

优点

适用于多种平台,且打包后的zip文件可以通过其它工具打开

缺点

QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库。
依赖Zlip,因此编译QuaZIP库需要依赖zlip库。

实现

(1)接口说明
QuaZip中的JlCompress类用来压缩和解压缩文件

/**
    压缩文件夹
    参数一fileCompressed:压缩后的文件
    参数二dir:待压缩的目录
    参数三recursive:是否递归
**/
static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);

/**
    解压缩文件夹 
    参数一fileCompressed:待解压缩的文件
    参数二fileCompressed:解压缩存放的目录
**/
static QStringList extractDir(QString fileCompressed, QString dir = QString());

(2) 配置
编好的QuaZip放入工程目录下
在工程中将quazip.lib所在库目录、头文件所在的目录添加到工程中。
pro中添加:

LIBS += -L"D:/quazip/lib" -lquazip
INCLUDEPATH += D:/quazip/src
DEPENDPATH += D:/quazip/src

(3) 压缩/解压缩

#include <QApplication>
#include "JlCompress.h"  // 导入QuaZip头文件

int main(int argc, char **argv)
{
    QApplication app(argc,argv);

    // 压缩文件夹
    JlCompress::compressDir("F:\\QuaZip.zip", "F:\\QuaZip");

    // 解压缩文件夹
    JlCompress::extractDir("F:\\QuaZip.zip", "F:\\ExtractQuaZip");

    return app.exec();
}

五、参考资料

Qt下压缩解压文件夹(2)Qzipwriter Qzipreader_黄权浩的博客-CSDN博客
利用Qt的qCompress和qUncompress来压缩和解压文件_prompty的博客-CSDN博客
Qt之zip压缩/解压缩-QuaZIP-阿里云开发者社区

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Qt的QFile和QProcess类来实现在macOS上压缩文件的操作。 首先,你需要创建一个QProcess对象,并设置它的工作目录和命令行参数。例如,如果你想要压缩一个名为“file.zip”的文件到当前目录下,你可以这样写: ```c++ QString program = "unzip"; QStringList arguments; arguments << "-o" << "file.zip"; // -o参数表示覆盖已存在的文件 QProcess *unzipProcess = new QProcess(this); unzipProcess->setWorkingDirectory(QDir::currentPath()); unzipProcess->start(program, arguments); ``` 在这个例子中,我们传递了一个命令行参数“-o”,这个参数表示覆盖已存在的文件。你可以根据你的需要添加其他参数。 接下来,你需要连接QProcess对象的readyReadStandardOutput()信号和readyReadStandardError()信号,以便在压缩过程中实时获取输出和错误信息。 ```c++ connect(unzipProcess, &QProcess::readyReadStandardOutput, [=]() { QString output = unzipProcess->readAllStandardOutput(); // 处理输出信息 }); connect(unzipProcess, &QProcess::readyReadStandardError, [=]() { QString error = unzipProcess->readAllStandardError(); // 处理错误信息 }); ``` 最后,你需要等待QProcess对象的finished()信号,以确保压缩操作已经完成。你可以检查返回的exit code来确定压缩是否成功。 ```c++ connect(unzipProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [=](int exitCode, QProcess::ExitStatus exitStatus) { if (exitCode == 0 && exitStatus == QProcess::NormalExit) { // 压缩成功 } else { // 压缩失败 } }); ``` 以上是在macOS上使用Qt实现压缩文件的基本流程,你可以根据你的具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值