qt QZipWriter详解

devtools/2024/12/27 5:05:32/
1、概述

QZipWriter是Qt框架中用于创建ZIP文件的类。它允许开发者将多个文件和目录压缩成一个ZIP文件,支持多种压缩算法,并且易于集成到现有的Qt项目中。通过QZipWriter,开发者可以轻松实现文件的压缩、管理压缩包中的文件等功能。

需要注意的是,QZipWriter属于QtGui模块,在Qt 6中已被移除,但在早期的Qt版本中,如Qt 5,它仍然是一个可用的类。此外,要使用QZipWriter,需要在安装Qt时选择Sources源码安装,否则无法使用该类。

2、重要方法

QZipWriter类提供了一些关键的方法来操作ZIP文件,以下是一些重要的方法:

  • 构造方法:QZipWriter(const QString &fileName, QIODevice::OpenMode mode = (QIODevice::WriteOnly | QIODevice::Truncate));其中,fileName参数指定了要创建的ZIP文件的路径,mode参数指定了打开文件的模式,默认为只写和截断模式。
  • 设置压缩策略:void setCompressionPolicy(CompressionPolicy policy);其中,CompressionPolicy是一个枚举类型,用于指定压缩策略,包括始终压缩(AlwaysCompress)、从不压缩(NeverCompress)和自动压缩(AutoCompress)。
  • 添加文件:void addFile(const QString &fileName, const QByteArray &data);该方法允许将指定的文件数据添加到ZIP文件中。fileName参数指定了文件在ZIP文件中的路径,data参数包含了要添加的文件数据。
  • 添加目录:void addDirectory(const QString &dirName);该方法允许在ZIP文件中创建一个新的目录。dirName参数指定了要创建的目录的名称。
3、重要信号

QZipWriter类本身并不直接提供信号(signals)。然而,在使用QZipWriter进行文件压缩时,可以结合Qt的信号槽机制来处理压缩过程中的各种事件。例如,可以在一个单独的线程中执行压缩操作,并通过信号将压缩进度、成功或失败的结果传递回主线程。

虽然QZipWriter没有专门的信号,但开发者可以通过自定义的方式实现类似的通知机制。例如,可以在压缩类中添加一个信号,当压缩完成时触发该信号,并传递压缩结果作为参数。

4、常用枚举类型

QZipWriter类中使用了一个枚举类型CompressionPolicy来指定压缩策略,该枚举类型包含以下三个值:

  • AlwaysCompress:始终对文件进行压缩。
  • NeverCompress:从不对文件进行压缩。
  • AutoCompress:根据文件的内容和类型自动决定是否进行压缩
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QTextStream>
#include <QFileInfo>
#include <QtGui/private/qzipwriter_p.h> // 注意:在Qt 6中,QZipWriter已被移除,需要从Qt 5的源码中查找该头文件// 递归函数,用于将文件夹及其子文件夹中的文件添加到ZIP压缩包
void addFolderToZip(QZipWriter &zipWriter, const QString &folderPath, const QString &parentFolder = "") {QDir dir(folderPath);// 获取该文件夹下的所有文件和子文件夹QStringList files = dir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);foreach (const QString &fileName, files) {QString fullPath = dir.filePath(fileName);QString zipFileName = parentFolder.isEmpty() ? fileName : parentFolder + "/" + fileName;if (QFileInfo(fullPath).isDir()) {// 如果是文件夹,则递归调用addFolderToZip(zipWriter, fullPath, zipFileName);} else {// 如果是文件,则添加到ZIPQFile file(fullPath);if (file.open(QIODevice::ReadOnly)) {zipWriter.addFile(zipFileName, &file);  // 添加文件到ZIPfile.close();} else {qCritical() << "Failed to open file:" << fullPath;}}}
}int main(int argc, char *argv[])
{QApplication a(argc, argv);QString folderPath  = "D:/gui/Qt"; // 替换为要压缩的源目录路径QString zipFilePath  = "D:/gui/Qt.zip"; // 替换为目标ZIP文件路径// 创建 QFile 对象并打开为写模式QFile zipFile(zipFilePath);if (!zipFile.open(QIODevice::WriteOnly)) {qCritical() << "Failed to open ZIP file for writing.";return -1;}// 创建 QZipWriter 对象,准备压缩文件QZipWriter zipWriter(&zipFile);zipWriter.setCompressionPolicy(QZipWriter::AutoCompress);// 开始递归添加文件夹中的文件addFolderToZip(zipWriter, folderPath, "qt");// 关闭 ZIP 文件zipWriter.close();zipFile.close();qDebug() << "Folder compression completed successfully.";return a.exec();
}

注意:要在.pro添加如下:

QT += gui-private

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 


http://www.ppmy.cn/devtools/145718.html

相关文章

太空探索的未来掌握在人工智能和机器人手中

一个世纪以来&#xff0c;全球各国一直在竞相探索太空。值得注意的是&#xff0c;这场竞赛并没有所谓的最终胜利。随着各国向外太空发射更多的火箭和卫星&#xff0c;它们获取了更多关于那些漂浮在太空中的各类物体的信息。与许多其他行业一样&#xff0c;太空探索过程也在采用…

大语言模型学习工具及资源总结和落地应用

当前&#xff0c;随着人工智能技术的迅猛发展&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;在各个领域的应用日益广泛。以下是国内外常见的大语言模型工具、已经落地部署的应用以及学习相关的网站和资源的详细介绍。 一、国内外常见的大语言模型…

以客户成功为核心,镜舟科技驱动数据库开源商业化创新

镜舟科技 CEO 孙文现 2024 年&#xff0c;在 StarRocks 社区朋友们和众多行业大客户的支持下&#xff0c;镜舟科技向前迈进了一小步&#xff0c;同时对于镜舟而言也是商业化推进的一大步。今年&#xff0c;镜舟实现了从追求市占率到追求商业成功的战略转型&#xff0c;并展现出…

【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点

etcd 是一个高可用的分布式键值存储&#xff0c;广泛应用于存储服务发现、配置管理等场景。为了确保集群的稳定性和可扩展性&#xff0c;管理成员节点的添加、删除和更新变得尤为重要。本文将指导您如何在etcd集群中处理成员管理&#xff0c;帮助您高效地维护集群节点。 目录 …

从零开始C++棋牌游戏开发之第三篇:游戏的界面布局设计

在游戏开发的旅途中&#xff0c;界面布局设计是一个充满创意和挑战的环节。对于棋牌类游戏而言&#xff0c;界面不仅仅是功能的载体&#xff0c;更是玩家与游戏互动的桥梁。一个清晰、直观且美观的界面可以显著提升游戏的用户体验。 在这篇文章中&#xff0c;我们将从功能需求…

游戏引擎学习第56天

仓库&#xff1a; https://gitee.com/mrxiao_com/2d_game 回顾 我们正在设计一个从零开始开发的游戏引擎&#xff0c;目标是不使用任何现成的库或引擎。在当前阶段&#xff0c;我们正专注于如何管理游戏世界中的实体布局&#xff0c;优化系统以便能够处理不同频率的实体更新。…

VUE前端实现防抖节流 Lodash

方法一&#xff1a;采用Lodash工具库 Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。 &#xff08;1&#xff09;采用终端导入Lodash库 $ npm i -g npm $ npm i --save lodash &#xff08;2&#xff09;应用 示例&#xff1a;搜索框输入防抖 在这个示例…

HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别

在智能手机、平板和其他智能设备日益智能化的今天&#xff0c;视觉识别技术成为提升用户体验和智能交互的重要手段。HarmonyOS NEXT通过基础视觉服务&#xff08;HMS Core Vision&#xff09;提供了一套强大的视觉识别功能&#xff0c;其中多目标识别作为其关键技术之一&#x…