qt压缩解压文件夹

news/2024/10/19 23:25:12/

首先写这篇文章的初衷,整个网络上只要搜QT的QZipWriter和QZipReader解压缩,几乎都是有问题的,都是只针对一个文件的解压缩,但实际情况下,我们一般都是对文件夹进行解压缩,在搜不到Qt本身压缩工具的使用方法的情况下,大家一般都会使用三方的解压缩源码,例如minizip和quazip来实现,但其实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;elseret=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;

完整源码路径


http://www.ppmy.cn/news/785885.html

相关文章

jupyter notebook 压缩/解压文件夹

转载请注明出处&#xff01;&#xff01;&#xff01; 压缩 压缩成zip格式 # 压缩当前路径所有文件&#xff0c;输出zip文件 path./import zipfile,os zipName student_id.zip #压缩后文件的位置及名称 f zipfile.ZipFile( zipName, w, zipfile.ZIP_DEFLATED ) for dirpat…

把linux文件夹压缩成tar.gz的命令

解压 tar zxvf 文件名.tar.gz 压缩 tar zcvf 文件名.tar.gz 目标名

java实现文件夹压缩

java实现包含文件的文件夹ZIP压缩&#xff0c;总结如下&#xff1a; 解决中文乱码的问题&#xff0c;ZipOutputStream用org.apache.tools.zip.&#xff08;而不是用java.util.zip.&#xff09;&#xff0c;指定编码为GBK&#xff1b;ZipEntry的setTime(long long)方法可以设置…

计算机限制无法压缩,电脑上文件夹压缩不了怎么办

1. 我的电脑怎么不能压缩文件了 电脑不能压缩文件的原因可能是电脑系统出错导致的&#xff0c;重新进行压缩即可&#xff0c;具体方法步骤如下&#xff1a; 1、首先打开自己的文件夹或者文档&#xff0c;选择需要压缩的文件。 2、选中文件夹&#xff0c;右击选择压缩到“当前文…

java将文件夹压缩成zip java按照目录结构压缩文件夹

前言 用java将文件夹压缩成zip包&#xff0c;像压缩软件一样&#xff0c;按照目录结构压缩&#xff08;包含当前文件夹&#xff09;网上没有找到太合适的&#xff0c;借鉴其它帖子&#xff0c;自己写了一个 代码 package xin.yangshuai.mybatisgeneratorweb.util;import jav…

C#压缩文件夹

在需要的地方直接调用就可 CompressDirectory(newpath, true); /// 压缩文件夹 /// 要打包的文件夹 /// 是否删除原文件夹 public static void CompressDirectory(string dirPath, bool deleteDir) { /…

文件夹压缩为war包

在压缩的文件夹内打开cmd命令窗口 压缩命令 jar -cvf Foldername.war * war * 之间有空格

linux在服务器压缩文件夹,Linux服务器压缩文件夹

我们需要从Linux服务器上下载文件夹时&#xff0c;若文件夹内小文件较多&#xff0c;往往下载慢&#xff0c;例如日志文件夹。下载前将文件夹打包是个比较好的选择 下面提供两种压缩文件夹的方式&#xff1a; 1.使用WinSCP客户端 右键需要压缩的文件夹&#xff0c;文件自定义命…