使用 QZipReader/QZipWriter 解压/压缩 Zip格式文件

pro文件需配置

QT += gui-private

代码

#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QDebug>
#include "QZipReader.h"

// 解压
void extractZip(const QString& zipFilePath, const QString& outputDirPath) 
{
    // 打开ZIP文件
    QFile zipFile(zipFilePath);
    if (!zipFile.open(QIODevice::ReadOnly)) 
    {
        qWarning() << "无法打开ZIP文件:" << zipFilePath;
        return;
    }

    // 创建QZipReader对象
    QZipReader zipReader(&zipFile);
    if (!zipReader.isReadable()) 
    {
        qWarning() << "无法读取ZIP文件:" << zipFilePath;
        return;
    }

    // 创建输出目录
    QDir outputDir(outputDirPath);
    if (!outputDir.exists())
    {
        outputDir.mkpath(".");
    }

    // 获取ZIP文件中的文件信息并解压
    const QVector<QZipReader::FileInfo> fileInfoList = zipReader.fileInfoList();
    for (const QZipReader::FileInfo& fileInfo : fileInfoList) 
    {
        if (fileInfo.isFile) 
        {
            // 提取文件
            QString filePath = outputDirPath + "/" + fileInfo.filePath;

            QFileInfo info(filePath);
            QDir dir(info.absoluteDir());
            if(!dir.exists())
            {
                dir.mkpath(info.absoluteDir().path());
            }

            QFile outFile(filePath);
            if (outFile.open(QIODevice::WriteOnly)) 
            {
                outFile.write(zipReader.fileData(fileInfo.filePath));
                outFile.close();
                qDebug() << "解压文件:" << filePath;
            }
            else
            {
                qWarning() << "无法创建文件:" << filePath;
            }
        }
        else if (fileInfo.isDir)
        {
            // 创建目录
            QDir().mkpath(outputDirPath + "/" + fileInfo.filePath);
            qDebug() << "创建目录:" << outputDirPath + "/" + fileInfo.filePath;
        }
    }
}

// 压缩文件(压缩文件夹待实现)
void compressZip(const QStringList& fileNames, const QString& path)
{
    QZipWriter zipWriter(path);

    foreach(const QString & fileName, fileNames)
    {
        if (fileName.isEmpty())
        {
            continue;
        }

        QFileInfo fileInfo(fileName);
        if (!fileInfo.exists())
        {
            continue;
        }

        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly))
        {
            continue;
        }

        // 添加文件
        zipWriter.addFile(fileInfo.fileName(), file.readAll());
        file.close();

        //添加文件夹
        //zipWriter.addDirectory(strDir);
    }

    zipWriter.close();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString outputDirPath  = "D:/";
    QString zipFilePath  = "D:/gui/Qt.zip";
    extractZip(zipFilePath, outputDirPath);
    return 0;
}
posted @ 2025-04-24 15:01  上车去广西  阅读(299)  评论(0)    收藏  举报