qt压缩解压文件夹

82 篇文章 1 订阅

首先写这篇文章的初衷,整个网络上只要搜QT的QZipWriter和QZipReader解压缩,几乎都是有问题的,都是只针对一个文件的解压缩,但实际情况下,我们一般都是对文件夹进行解压缩,在搜不到Qt本身压缩工具的使用方法的情况下,大家一般都会使用三方的解压缩源码,例如minizipquazip来实现,但其实QT本身也可以做到的,如果有帮助麻烦点赞收藏。
方法如下:
通过的QZipWriter的addFile来实现的。
第一步:pro文件中添加 QT += gui-private
第二步:头文件中添加:

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

第三步:QZipWriter的addFile添加压缩文件,注意由于层级结构,addFile的第一个参数,是根据压缩根目录的相对路径的文件名,第二个参数是文件内容:

//SavePath:压缩到的路径;dirPath:需要压缩的目录。
bool zipDir(const QString& dirPath,QString SavePath)
{
    bool  ret;
    QZipWriter *writer = new QZipWriter(SavePath);
    if(QZipWriterEx(writer,dirPath,dirPath))//dirPath为了方便回调,所以传了两次。
        ret=true;
    else
        ret=false;

    writer->close();
    delete writer;
    return  ret;
}

bool  QZipWriterEx(QZipWriter *writer, QString tmpPath, QString basePath)
{
    QDir dir(tmpPath);
    foreach (QFileInfo info, dir.entryInfoList())
    {
        if (info.fileName() == "." || info.fileName() == "..")
            continue;
        if (info.isFile())
        {
            QFile upfile(info.filePath());
            upfile.open(QIODevice::ReadOnly);
            QString fileName = info.filePath().mid(basePath.size()+1,info.filePath().size());
            writer->addFile(fileName,upfile.readAll());
            qDebug()<<fileName<<tmpPath<<basePath;
            upfile.close();
        }
        else if (info.isDir())
        {
            QZipWriterEx(writer,info.filePath(),basePath);
        }
    }
    return true;
}

解压:
当我们的压缩文件为一个文件时,调用extractAll就可以搞定了,但是一般情况我们压缩文件都是多层级的目录结构。所以需要QZipReader的fileInfoList获取所有文件,然后通过fileData依次获取文件内容,然后写入文件,解压完成。
特别需要注意的是fileData在windows系统它只识别GBK的编码,所以我们需要将文件名的编码进行转换。

        QByteArray dt = zipreader.fileInfoList().at(i).filePath.toUtf8();
        QString strtemp = QString::fromLocal8Bit(dt);

实例:

 /// 解压文件夹
    QDir dir(savepath);
    if (!dir.exists())
    {
        dir.mkpath(savepath);
    }
    bool unzipok = false;
    QZipReader zipreader(filepath);
//    unzipok = zipreader.extractAll(savepath);   //可加可不加没有什么影响

    for (int i = 0; i < zipreader.fileInfoList().size(); ++i) {
        QStringList paths = zipreader.fileInfoList().at(i).filePath.split("/");
        paths.removeLast();
        QString path = paths.join("/");
        QDir subdir(savepath + "/" + path);
        if (!subdir.exists())
            dir.mkpath(QString::fromLocal8Bit("%1").arg(savepath + "/" + path));

        QFile file(savepath + "/" + zipreader.fileInfoList().at(i).filePath);
        file.open(QIODevice::WriteOnly);
        //注意编码问题
        QByteArray dt = zipreader.fileInfoList().at(i).filePath.toUtf8();
        QString strtemp = QString::fromLocal8Bit(dt);

        QByteArray array = zipreader.fileData(strtemp);
        file.write(array);
        file.close();
    }
    zipreader.close();
    return unzipok;

完整源码路径

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方忘忧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值