qt QZipWriter详解

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 {
            // 如果是文件,则添加到ZIP
            QFile file(fullPath);
            if (file.open(QIODevice::ReadOnly)) {
                zipWriter.addFile(zipFileName, &file);  // 添加文件到ZIP
                file.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

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

           

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT 实战之元服务:静态案例效果---查看国内航班服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index代码 import { authen…

【Java】Jackson序列化案例分析

1.Jackson介绍 Jackson 是一个流行的 Java 库&#xff0c;用于处理 JSON 数据。它提供了高效的序列化和反序列化功能&#xff0c;能够将 Java 对象转换为 JSON 格式&#xff0c;反之亦然。 它由 FasterXML 开发和维护。Jackson 的设计目标是提供高效、灵活且易于使用的 JSON 处…

Java反射学习(2)(“反射“机制获取构造方法及内部信息(Constructor类))

目录 一、"Class"对象实例化的常见三种方式以及使用时机。 &#xff08;1&#xff09;源代码(编写)阶段——使用全限定类名.forName()。 &#xff08;2&#xff09;加载阶段——使用类名.class。 &#xff08;3&#xff09;运行阶段——使用对象.getClass()。 二、Ja…

洛谷 P1595 信封问题 C语言dp

题目描述 某人写了 n 封信和 n 个信封&#xff0c;如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。 输入格式 一个信封数 n&#xff0c;保证 n≤20。 输出格式 一个整数&#xff0c;代表有多少种情况。 输入输出样例 输入 #1 2 输出 #1 1 输入 #2 3 输…

【LuaFramework】服务器模块相关知识

目录 一、客户端代码 二、本地服务器代码 三、解决服务器无法多次接收客户端消息问题 一、客户端代码 连接本地服务器127.0.0.1:2012端口&#xff08;如何创本地服务器&#xff0c;放最后说&#xff09;&#xff0c;连接成功后会回调 协议号Connect是101&#xff0c;其他如下…

解决Ascend上vllm运行时出现urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]

背景 尝试使用vllm模型&#xff0c;脚本代码如下&#xff1a; from vllm import LLM, SamplingParamsprompts ["Hello, my name is","The president of the United States is","The capital of France is","The future of AI is", …

【卷积神经网络】常用评价指标总结

评估指标 概述 该评价指标适合分类任务与目标检测&#xff0c;主要用于评估模型的性能。该文章对相关指标进行总结&#xff0c;同时对输出的图片进行学习分析 混淆矩阵的组成 TP&#xff08;True Positives&#xff0c;真正例&#xff09;&#xff1a;实际为正例&#xff0c;…

HarmonyOS NEXT 的技术发展和市场趋势:打造1+8+N的万物互联新世界

随着5G、AI、物联网等技术的飞速发展&#xff0c;全球智能设备和操作系统的竞争也日益激烈。在这一背景下&#xff0c;华为推出的HarmonyOS NEXT正逐渐成为智能设备生态中一个重要的参与者&#xff0c;其独特的18N战略布局以及跨设备、跨平台的互联互通理念&#xff0c;正在塑造…

免费 IP 归属地接口

免费GEOIP&#xff0c;查询IP信息&#xff0c;支持IPV4 IPV6 ,包含国家地理位置&#xff0c;维度&#xff0c;asm,邮编 等&#xff0c;例如 例如查询1.1.1.1 http://geoip.91hu.top/?ip1.1.1.1 返回json 对象

以太网通信--读取物理层PHY芯片的状态

PHY芯片通过MDIO接口进行读写&#xff0c;框图如下所示&#xff1a; 原理很简单&#xff0c;就是按照时序将PHY芯片的指定寄存器信息读出或者写入。 MDC时钟需要输出到PHY芯片&#xff0c;一般不低于80MHz。 MDIO是双向接口&#xff0c;FPGA读出状态信息时为输入&#xff0c;FP…

Docker服务发现新纪元:探索Consul的无限魅力

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 •座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元个人主页&#xff1a;团儿.-CSDN博客 目录 前言&…

OpenHarmony-6.IPC/RPC组件

IPC/RPC组件机制 1.基本概念 IPC&#xff1a;设备内的进程间通信&#xff08;Inter-Process Communication&#xff09;。 RPC&#xff1a;设备间的进程间通信&#xff08;Remote Procedure Call&#xff09;。 IPC/RPC用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱…

0.机顶盒晶晨s905l3b芯片--刷入第三方系统+安卓9 root教程+armbian写入EMMC教程

机顶盒s905l3b芯片刷第三方系统安卓9 root教程刷armbian写入EMMC教程 声明&#xff1a; 由于固件、软件、镜像等持续更新&#xff0c;本文仅代表当前所使用版本的流畅安装记录。行文略长&#xff0c;关键代码处会配以截图展示&#xff0c;请自行对比是否存在差异导致安装失败…

视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案

Liveweb是一款功能强大、灵活部署的安防视频监控平台&#xff0c;支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统安防监控功能&#xff0c;还支持接入AI智能分析&#…

汇编语言学习

想要理解栈溢出的最基本原理&#xff0c;汇编和栈是必不可少的&#xff0c;不然想我之前学了也是白学&#xff0c;原理都不知道 一、准备 1.安装gcc sudo apt-get build-dep gcc 这里显示版本不对&#xff0c;我用的是国内镜像源&#xff0c;需要换一下配置 sudo nano /e…

“乡村探索者”:村旅游网站的移动应用开发

3.1 可行性分析 从三个不同的角度来分析&#xff0c;确保开发成功的前提是有可行性分析&#xff0c;只有进行提前分析&#xff0c;符合程序开发流程才不至于开发过程的中断。 3.1.1 技术可行性 在技术实现层次&#xff0c;分析了好几种技术实现方法&#xff0c;并且都有对应的成…

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ Keras 快速入门&#xff1a; 神经网络的基本数据结…

MySQL用户授权

什么是数据库 数据库概述&#xff1a;数据库是按照一定的数据结构将数据存储在存储器的集合常见数据库软件 软件名开源跨平台厂 商Oracle否是甲骨文MySQL是是甲骨文SQL Server否否微软DB2否是IBMMongoDB是是MongoDB Inc.Redis是是开源软件Memcached是是开源软件 DB (DataBas…

2025年我国网络安全发展形势展望

展望2025年&#xff0c;我国网络安全产业有望迎来新的快速增长阶段&#xff0c;零信任安全架构将在各行各业加快应用落地&#xff0c;数据安全技术攻关和应用进程加快&#xff0c;关键基础设施安全能力不断提升。同时&#xff0c;也应关注国家级网络对抗风险加剧、网络安全产业…

GitPuk安装配置指南

GitPuk是一款开源免费的代码管理工具&#xff0c;上篇文章已经介绍了Gitpuk的功能与优势&#xff0c;这篇文章将为大家讲解如何快速安装和配置GitPuk&#xff0c;助力你快速的启动GitPuk管理代码 1. 安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Windows安装 下载…