Qt 实现压缩文件、文件夹和解压缩操作zip
一、实现方式
通过Qt自带的库来实现,使用多线程方式,通过信号和槽来触发压缩与解压缩,并将压缩和解压缩结果回传过来。
使用的类:
#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"
二、环境准备
1、在.pro文件中添加模块gui-private
QT += core gui gui-private
若未cmake工程,需要在CMakeList.txt中添加
includeinclude_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}))
三、实现示例
#include <QFileInfoList>
#include <QDir>
#include <QFileInfo>#define FILE_MAX_SIZE 1024QFileInfoList ergodic_compression_file(QZipWriter *writer, const QString& rootPath, QString dirPath)
{QDir crrDir(dirPath);///解压失败的文件QFileInfoList errFileList;///添加文件QFileInfoList fileList = crrDir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);for (const QFileInfo& fileInfo : fileList){QString subFilePath = fileInfo.absoluteFilePath();QString zipWithinfilePath = subFilePath.mid(rootPath.size() + 1);QFile file(subFilePath);qint64 size = file.size() / 1024 / 1024;if (!file.open(QIODevice::ReadOnly) || size > FILE_MAX_SIZE){///打开文件失败,或者大于1GB导致无法解压的文件errFileList.append(fileInfo);continue;}writer->addFile(zipWithinfilePath, file.readAll());file.close();}///添加文件夹QFileInfoList folderList = crrDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);for (const QFileInfo& folderInfo : folderList){QString subDirPath = folderInfo.absoluteFilePath();QString zipWithinDirPath = subDirPath.mid(rootPath.size() + 1);writer->addDirectory(zipWithinDirPath);QFileInfoList child_file_list = ergodic_compression_file(writer, rootPath, subDirPath);errFileList.append(child_file_list);}return errFileList;
}bool compression_zip_file(const QString& selectFile2DirPath, const QString& savePath)
{if (selectFile2DirPath.isEmpty() || savePath.isEmpty()){return false;}if (!QFile::exists(selectFile2DirPath) || !QFileInfo(savePath).isDir()){return false;}if (QFileInfo(selectFile2DirPath).isFile())///压缩的是一个文件{QString fileName = QFileInfo(selectFile2DirPath).baseName();QString writerFilePath = savePath + "/" + fileName + ".zip";QFile selectFile(selectFile2DirPath);qint64 size = selectFile.size() / 1024 / 1024;if (!selectFile.open(QIODevice::ReadOnly) || size > FILE_MAX_SIZE){///打开文件失败,或者大于1GB导致无法压缩的文件return false;}QString addFileName = QFileInfo(selectFile2DirPath).fileName();QZipWriter writer(writerFilePath);writer.addFile(addFileName, selectFile.readAll());selectFile.close();return true;}else///压缩的是一个文件夹{QString zipRootFolder = selectFile2DirPath.mid(selectFile2DirPath.lastIndexOf("/") + 1);QString selectDirUpDir = selectFile2DirPath.left(selectFile2DirPath.lastIndexOf("/"));QString saveFilePath = savePath + "/" + zipRootFolder + ".zip";QZipWriter writer(saveFilePath);writer.addDirectory(zipRootFolder);QFileInfoList fileList = ergodic_compression_file(&writer, selectDirUpDir, selectFile2DirPath);writer.close();if (0 == fileList.size())return true;return false;}
}bool decompression_zip_file(const QString& selectZipFilePath, const QString& savePath)
{if (selectZipFilePath.isEmpty() || savePath.isEmpty()){return false;}if (!QFileInfo(selectZipFilePath).isFile() || !QFileInfo(savePath).isDir()){return false;}bool ret = true;QZipReader zipReader(selectZipFilePath);QVector<QZipReader::FileInfo> zipAllFiles = zipReader.fileInfoList();for (const QZipReader::FileInfo& zipFileInfo : zipAllFiles){const QString currDir2File = savePath + "/" + zipFileInfo.filePath;if (zipFileInfo.isSymLink){QString destination = QFile::decodeName(zipReader.fileData(zipFileInfo.filePath));if (destination.isEmpty()){ret = false;continue;}QFileInfo linkFi(currDir2File);if (!QFile::exists(linkFi.absolutePath()))QDir::root().mkpath(linkFi.absolutePath());if (!QFile::link(destination, currDir2File)){ret = false;continue;}}if (zipFileInfo.isDir){QDir(savePath).mkpath(currDir2File);}if (zipFileInfo.isFile){QByteArray dt = zipFileInfo.filePath.toUtf8();QString strtmp = QString::fromLocal8Bit(dt);QFile currFile(currDir2File);if (!currFile.isOpen()){currFile.open(QIODevice::WriteOnly);}else {ret = false;continue;}qint64 size = zipFileInfo.size / 1024 / 1024;if (size > FILE_MAX_SIZE){ret = false;continue;}QByteArray byteArr = zipReader.fileData(strtmp);currFile.write(byteArr);currFile.setPermissions(zipFileInfo.permissions);currFile.close();}}zipReader.close();return ret;
}
待完善:
1、中文路径,文件名含有中文
2、快捷文件,隐藏文件
3、隐藏文件夹,.dir和…dir,例如:.vs
4、单个超大文件的支持(1G以上)
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810
相关文章:
Qt 实现压缩文件、文件夹和解压缩操作zip
一、实现方式 通过Qt自带的库来实现,使用多线程方式,通过信号和槽来触发压缩与解压缩,并将压缩和解压缩结果回传过来。 使用的类: #include "QtGui/private/qzipreader_p.h" #include "QtGui/private/qzipwriter…...
简单工厂模式VS策略模式
简单工厂模式VS策略模式 今天复习设计模式,由于简单工厂模式和策略模式太像了,重新整理梳理一下 简单工厂模式MUL图: 策略模式UML图: 1、简单工厂模式中只管创建实例,具体怎么使用工厂实例由调用方决定,…...
【MySQL】触发器 (十二)
🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…...
听说 Spring Bean 的创建还有一条捷径?
文章目录 1. resolveBeforeInstantiation1.1 applyBeanPostProcessorsBeforeInstantiation1.2 applyBeanPostProcessorsAfterInitialization1.3 案例 2. 源码实践2.1 切面 Bean2.2 普通 Bean 在 Spring Bean 的创建方法中,有如下一段代码: AbstractAutow…...
大数据课程E6——Flume的Processor
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Processor的概念和配置参数; ⚪ 掌握Processor的使用方法; ⚪ 掌握Processor的Default Processo; ⚪ 掌握Processor的Load Balance Processo; 一、Failover Sink Processor 1. …...
实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览
要进行Office365邮箱的授权对接,你需要先申请一个应用,并获取授权访问令牌。 以下是一个简单的步骤: 登录 Azure 门户:https://portal.azure.com/创建一个新的应用程序,或者使用现有的应用程序。要创建新的应用程序&…...
(AcWing)多重背包问题 I,II
有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数 N,…...
如何把几个视频合并在一起?视频合并方法分享
当我们需要制作一个比较长的视频时,将多个视频进行合并可以使得整个过程更加高效。此外,合并视频还可以避免出现“剪辑断层”的情况,使得视频内容更加连贯,更加容易被观众理解和接受。再有,合并视频还可以减少视频文件…...
【MyBatis】初学MyBatis
目录 MyBatis 是什么?MyBatis框架搭建1.添加MyBatis框架2.设置MyBatis配置数据库的相关链接信息xml 保存路径和命名格式 根据MyBatis写法完成数据库的操作MyBatis插件MyBatis传递参数查询${} 和 #{} 有什么区别?SQL注入问题 MyBatis like查询MyBatis多表…...
深度学习训练营之DCGAN网络学习
深度学习训练营之DCGAN网络学习 原文链接环境介绍DCGAN简单介绍生成器(Generator)判别器(Discriminator)对抗训练 前置工作导入第三方库导入数据数据查看 定义模型初始化权重定义生成器generator定义判别器 模型训练定义参数模型训…...
自定义MVC增删改查
目录 mymvcdemo是自定义mvc框架的使用示例 1.1 实体类 1.2 dao方法 1.3 写Service / biz 三层架构 1.4 建action 相当于selvert 1.5 con连接MySQL 8.0 版本 1.6 配置文件 XML 1.7 主界面布局 1.8 增加界面布局 1.9 写tld配置文件 2.0 注意架包 我是已经打包好的 mymv…...
RabbitMQ 教程 | 第2章 RabbitMQ 入门
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
双网卡如何配置DNS?我是一个仅主机模式配置静态(static)IP、一个NET或桥接(dhcp获取)
目录 一、所有主机初始化 二、135、136服务器,部署DNS调度服务器 1、更改主机主从DNS服务器的主机名称 2、安装bind软件、修改主配置文件 3、修改区域配置文件 4、修改数据文件 5、启动named服务、修改网卡信息 6、解析 7、双网卡的话记得注释以下内容、注…...
Android10: 动态隐藏导航栏和状态栏总结
(1)全屏相关设置 //(1)主题添加 <item name"android:windowFullscreen">true</item>//(2)setContentView之前添加 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCRE…...
roop 视频换脸
roop: one click face swap. 只用一张人脸图片,就能完成视频换脸。 项目地址: https://github.com/s0md3v/roopColab 部署: https://github.com/dream80/roop_colab 本文是本地部署的实践记录。 环境基础 OS: Ubuntu 22.04.2 LTSKernel: 5…...
Java类集框架(一)
目录 1.Collection集合接口 2.List 接口 (常用子类 ArrayList ,LinkedList,Vector) 3.Set 集合 接口(常用子类 HashSet LinkedHashSet,TreeSet) 4.集合输出(iterator , Enumeration) 1.Collection集合接口 Collection是集合中最大父接口,在接口中定义了核心的…...
Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程
由jspssh(springstruts2mysql)实现的企业物资信息管理系统,系统功能比较简单,实现了基本的管理员、操作员等用户管理、物品分类管理、物品管理、入库管理、出库管理、库存预警、客户管理、供应商管理等基本功能需要的可以联系我分…...
【Spring】深究SpringBoot自动装配原理
文章目录 前言1、main入口2、SpringBootApplication3、EnableAutoConfiguration4、AutoConfigurationImportSelector4.1、selectImports()4.2、getAutoConfigurationEntry()4.3、getCandidateConfigurations()4.4、loadFactoryNames() 5、META-INF/spring.factories6、总结 前言…...
阿里云负载均衡SLB网络型NLB负载均衡架构性能详解
阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡,支持超高性能和自动弹性能力,单实例可以达到1亿并发连接,帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级…...
JavaScript学习 -- SM4算法应用实例
SM4算法,也被称为国密算法,是中国公布的一种高效且安全的对称加密算法。在JavaScript中,我们可以通过使用CryptoJS库来实现SM4算法的加密和解密。本篇博客将为您介绍如何在JavaScript中使用SM4算法,并提供一个实际的案例。 首先&…...
水质评价避坑指南:当DO和NH3-N指标冲突时怎么办?
水质评价指标冲突的智能解法:熵权法实战与多维度决策 当溶解氧(DO)与氨氮(NH3-N)这两项关键水质指标出现评价矛盾时,环保工程师常陷入两难——DO浓度越高通常代表水质越好,而NH3-N数值越低则表明…...
Phi-3-mini-4k-instruct-gguf惊艳效果:中文长难句拆解+逻辑关系标注+通俗转述三重能力展示
Phi-3-mini-4k-instruct-gguf惊艳效果:中文长难句拆解逻辑关系标注通俗转述三重能力展示 1. 模型能力概览 Phi-3-mini-4k-instruct-gguf作为微软Phi-3系列的轻量级文本生成模型,在中文处理方面展现出令人惊喜的能力。这个开箱即用的模型特别擅长处理三…...
OpenClaw + Seedance 2.0实战:从零搭建全自动AI视频生成流水线
OpenClaw Seedance 2.0实战:从零搭建全自动AI视频生成流水线 前言 这篇记录我用OpenClaw Agent串联Seedance 2.0满血版API,搭建全自动视频生产流水线的完整过程。包括架构设计、Skill编写、API调用细节和踩坑记录。 一、架构设计 用户输入ÿ…...
GESP到底有没有必要考?说说我的真实看法
“老师,GESP要不要考?考了能免考CSP初赛,值不值?” 每次信奥赛家长群里一聊到这个,就会吵起来。 有人说"CCF官方的,含金量高,必须考"。也有人说"证书没用,浪费钱浪费…...
FedProx实战:如何用Python在异构网络中优化联邦学习(附代码)
FedProx实战:Python实现异构网络联邦学习优化指南 联邦学习作为分布式机器学习的前沿分支,正面临两大核心挑战:设备间的系统异构性(计算与通信能力差异)和数据分布的统计异构性(non-IID数据)。本…...
告别手动转换!用Python自动化处理CSV到Little_R的完整指南
告别手动转换!用Python自动化处理CSV到Little_R的完整指南 在数据科学和机器学习领域,数据格式转换是一项频繁且耗时的任务。特别是当我们需要将常见的CSV格式转换为特定领域专用的Little_R格式时,手动操作不仅效率低下,还容易出错…...
K8s混沌工程叛变:随机宕机暴露的职场PUA
在云原生架构席卷软件世界的今天,Kubernetes(K8s)以其强大的编排能力,成为分布式系统稳定运行的基石。随之兴起的混沌工程,则扮演着“压力测试师”的角色,通过主动注入Pod宕机、网络延迟等故障,…...
BR DI426数字输入模块
B&R DI426 数字输入模块是一款工业自动化系统用的 I/O 模块,主要用于采集现场开关量信号并传输至控制系统。一、基本概述型号:DI426类型:数字输入模块用途:采集工业现场的开关量信号,为控制系统提供输入数据二、主…...
TFLint Docker终极指南:在容器中轻松运行Terraform代码检查
TFLint Docker终极指南:在容器中轻松运行Terraform代码检查 【免费下载链接】tflint A Pluggable Terraform Linter 项目地址: https://gitcode.com/gh_mirrors/tf/tflint TFLint是一个可插拔的Terraform代码检查工具,帮助开发者发现Terraform配置…...
OpenWRT自动重拨号脚本:5分钟搞定公网IP获取(附定时任务配置)
OpenWRT公网IP自动化获取指南:从脚本编写到策略优化 家里搭建NAS或远程访问服务器时,公网IP就像一把钥匙——没有它,所有设备都锁在内网围墙里。我曾花了整整一周时间研究各家运营商政策,测试了三十多种拨号策略,最终总…...
