QT 使用QZipWriter进行文件压缩

发布于:2024-05-18 ⋅ 阅读:(76) ⋅ 点赞:(0)

目录

1、QZipWriter

2、主要功能

3、示例


1、QZipWriter

QZipWriter 是 Qt 提供的一个类,用于创建和管理 ZIP 文件。它属于 Qt 的 QtGui 模块,虽然在 Qt 6 中已经被移除,但在早期的 Qt 版本中,它被用作一种简便的方式来创建 ZIP 压缩包。QZipWriter 允许你创建一个 ZIP 文件,并向其中添加文件或目录。

2、主要功能

  • 创建 ZIP 文件:可以创建新的 ZIP 文件并向其中添加文件和目录。
  • 设置压缩策略:可以设置是否压缩文件。
  • 写入数据:可以向 ZIP 文件中写入任意数据。

3、示例

#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QTextStream>
#include <QFileInfo>
#include "qzipwriter_p.h"


void addFileToZip(QZipWriter &zipWriter, const QString &filePath, const QString &zipPath) {
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly)) {
        QZipWriter::FileInfo fileInfo;
        fileInfo.isDir = false;
        fileInfo.isFile = true;
        fileInfo.filePath = zipPath;
        fileInfo.size = file.size();

        zipWriter.addFile(fileInfo.filePath, file.readAll());
        file.close();
        qDebug() << "Added file to zip:" << zipPath;
    } else {
        qWarning() << "Failed to open file for reading:" << filePath;
    }
}


void addDirToZip(QZipWriter &zipWriter, const QString &dirPath, const QString &zipPath) {
    QDir dir(dirPath);
    if (!dir.exists()) {
        qWarning() << "Directory does not exist:" << dirPath;
        return;
    }

    QFileInfoList entries = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
    for (const QFileInfo &entry : entries) {
        QString newZipPath = zipPath.isEmpty() ? entry.fileName() : zipPath + "/" + entry.fileName();
        if (entry.isDir()) {
            zipWriter.addDirectory(newZipPath);
            addDirToZip(zipWriter, entry.absoluteFilePath(), newZipPath);
        } else {
            addFileToZip(zipWriter, entry.absoluteFilePath(), newZipPath);
        }
    }
}

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

    QString sourceDirPath = "path/to/source/folder";
    QString zipFilePath = "path/to/target/zipfile.zip";

    QFile zipFile(zipFilePath);
    if (!zipFile.open(QIODevice::WriteOnly)) {
        qWarning() << "Cannot open zip file for writing:" << zipFilePath;
        return -1;
    }

    QZipWriter zipWriter(&zipFile);
    zipWriter.setCompressionPolicy(QZipWriter::AutoCompress);

    addDirToZip(zipWriter, sourceDirPath, "");

    zipWriter.close();
    zipFile.close();

    qDebug() << "Folder successfully compressed to" << zipFilePath;

    return 0;
}