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算法,并提供一个实际的案例。 首先&…...
如何快速找回被遗忘的压缩包密码?ArchivePasswordTestTool终极指南
如何快速找回被遗忘的压缩包密码?ArchivePasswordTestTool终极指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经面…...
如何快速实现无人机合规飞行:基于ESP32的完整远程识别解决方案
如何快速实现无人机合规飞行:基于ESP32的完整远程识别解决方案 【免费下载链接】ArduRemoteID RemoteID support using OpenDroneID 项目地址: https://gitcode.com/gh_mirrors/ar/ArduRemoteID 在FAA和欧盟无人机法规日益严格的背景下,远程识别已…...
办公效率翻倍!OpenClaw AI 数字员工实操教程
适配系统:Windows 10 64位(新手专享版) 产品亮点: 零门槛安装:无需命令行操作,免去复杂环境配置即开即用:解压即安装,内置完整运行环境可视化操作:全程图形界面&#x…...
Windows HEIC缩略图预览:告别iPhone照片在Windows的“盲盒“时代
Windows HEIC缩略图预览:告别iPhone照片在Windows的"盲盒"时代 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails …...
FNF-PsychEngine终极指南:3个Lua脚本技巧让游戏体验飙升
FNF-PsychEngine终极指南:3个Lua脚本技巧让游戏体验飙升 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF-PsychEngine是一款功能强大的节奏游戏引擎ÿ…...
VoiceFixer终极指南:三分钟让模糊录音变清晰的免费语音修复神器
VoiceFixer终极指南:三分钟让模糊录音变清晰的免费语音修复神器 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否曾经因为一段珍贵的录音模糊不清而遗憾?也许是重要的会议…...
如何彻底解决TranslucentTB的Microsoft.VCLibs依赖缺失问题:3步诊断与修复指南
如何彻底解决TranslucentTB的Microsoft.VCLibs依赖缺失问题:3步诊断与修复指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB …...
Diablo Edit2:暗黑破坏神2存档编辑器终极指南,5分钟掌握角色修改神器
Diablo Edit2:暗黑破坏神2存档编辑器终极指南,5分钟掌握角色修改神器 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾在暗黑破坏神2中花费数小时刷装备却一无所获&…...
别再手动敲代码了!用FastAdmin的CRUD一键生成后台页面(附自定义模板技巧)
FastAdmin自动化开发实战:CRUD生成与模板定制全攻略 1. 为什么选择自动化生成而非手动编码? 在快节奏的开发环境中,重复编写基础CRUD代码已成为效率杀手。我曾参与过一个电商后台项目,需要为30多个数据表开发管理界面。最初团队采…...
如何通过G-Helper让华硕笔记本性能与续航获得双重提升?
如何通过G-Helper让华硕笔记本性能与续航获得双重提升? 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…...
