Qt 使用 QZipReader 解压文件_QZipReader

Qt 使用 QZipReader 解压文件


文章目录
  • Qt 使用 QZipReader 解压文件
  • 摘要
  • 关于 QZipReader
  • 使用 QZipReader
  • 代码解释:
  • 快速解 extractAll



关键字:

Qt

QZipReader

extractAll

Zip

解压缩

摘要

每日一坑,坑坑难过,今日在拉取上级给我的压缩包是发现总是解压有问题,总是无法完全解压,最后发现是上级的压缩文件中多了文件夹递归的情况,所以在本地进行模拟,发现可以解压,但是上级给我的就是加压不了,可以用标准的压缩工具可以解压缩,最后发现是上级在压缩的时候没有对应的目录信息,标准压缩工具是带有目录的信息,所以保险起见,我对每个文件做了取路径处理。

关于 QZipReader

QZipReader 并不是 Qt 官方提供的类,而是一个常见的第三方库或自定义实用类,用于读取和解压缩 ZIP 文件。

使用 QZipReader

以下是一个假设的 QZipReader 使用示例,包括如何解压包含文件夹的 ZIP 包:

假设 QZipReader 是一个自定义类(或第三方库)用于读取 ZIP 文件,以下代码示例展示如何使用 QZipReader 类解压包含文件夹的 ZIP 包:

#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QDebug>

// 头文件可能在不同的路径,确保包含正确的头文件
#include "QZipReader.h" 

bool extractAllFiles(const QString &zipFilePath, const QString &destPath) {
    QZipReader zipReader(zipFilePath);
    if (!zipReader.exists()) {
        qWarning() << "Zip file does not exist:" << zipFilePath;
        return false;
    }

    QDir dir(destPath);
    if (!dir.exists()) {
        if (!dir.mkpath(destPath)) {
            qWarning() << "Could not create directory:" << destPath;
            return false;
        }
    }

    foreach (const QZipReader::FileInfo &fileInfo, zipReader.fileInfoList()) {
        QString filePath = destPath + "/" + fileInfo.filePath;
        QFileInfo fileInfoObj(filePath);

        if (fileInfo.isDir) {
            if (!dir.mkpath(filePath)) {
                qWarning() << "Could not create directory:" << filePath;
                return false;
            }
        } else {
            QFile file(filePath);
            if (!file.open(QIODevice::WriteOnly)) {
                qWarning() << "Could not open file for writing:" << filePath;
                return false;
            }

            QByteArray data = zipReader.fileData(fileInfo.filePath);
            file.write(data);
            file.close();
        }
    }

    zipReader.close();
    return true;
}

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QString zipFilePath = "path/to/your/zipfile.zip";
    QString destPath = "path/to/extract/directory";

    if (extractAllFiles(zipFilePath, destPath)) {
        qDebug() << "Extraction successful!";
    } else {
        qDebug() << "Extraction failed!";
    }

    return app.exec();
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
代码解释:
  1. 初始化 QZipReader
  • QZipReader zipReader(zipFilePath):创建一个 QZipReader 实例,并指定要解压的 ZIP 文件路径。
  • zipReader.exists():检查 ZIP 文件是否存在。
  1. 创建目标目录
  • QDir dir(destPath):创建一个 QDir 实例,用于表示解压的目标路径。
  • dir.mkpath(destPath):如果目标路径不存在,则创建它。
  1. 遍历 ZIP 文件中的每个文件
  • zipReader.fileInfoList():获取 ZIP 文件中所有文件信息的列表。
  • foreach (const QZipReader::FileInfo &fileInfo, zipReader.fileInfoList()):遍历每个文件信息。
  • fileInfo.filePath:获取文件路径。
  • fileInfo.isDir:判断文件是否是目录。
  1. 处理文件和目录
  • QFileInfo fileInfoObj(filePath):创建 QFileInfo 对象以获取文件信息。
  • 如果是目录,则使用 dir.mkpath(filePath) 创建目录。
  • 如果是文件,则创建 QFile 对象并打开,以写模式写入数据。
  • zipReader.fileData(fileInfo.filePath):读取 ZIP 文件中对应文件的数据,并写入解压路径中的文件。
  1. 关闭 ZIP 文件
  • zipReader.close():关闭 ZIP 文件。

确保你包含了 QZipReader 的正确头文件,并且你的项目中已正确链接了相应的库。如果 QZipReader 是你自己的类,请根据你的实现来调整代码。

快速解 extractAll

如果可以确定文件是标准压缩文件,就可以使用快速解extractAll。


Qt 使用 QZipReader 解压文件_Zip_02