当前位置:   article > 正文

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

qt 解压缩zip文件

一、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();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二、qCompress

优点

Qt自带的api, 使用方便

缺点

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

实现

(1) 头文件

#include <QByteArray>
#include <QDebug>
#include <QFile>
#include <QIODevice>
  • 1
  • 2
  • 3
  • 4

(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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

三、Qzipwriter

优点

Qt自己的库,生成zip格式

缺点

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

实现

(1) 修改pro文件

QT       += gui-private
  • 1

(2) 导入头文件

#include <private/qzipwriter_p.h>
#include <private/qzipreader_p.h>
  • 1
  • 2

(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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

四、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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

LIBS += -L"D:/quazip/lib" -lquazip
INCLUDEPATH += D:/quazip/src
DEPENDPATH += D:/quazip/src
  • 1
  • 2
  • 3

(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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

五、参考资料

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/547623
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&