Zip压缩归档库-libzip介绍

news2024/11/16 10:58:17

1.简介

libzip是一个C库,用于读取、创建和修改zip格式的压缩文件。它支持从zip文件中读取、写入、添加和删除文件,还支持密码保护的zip文件。libzip是跨平台的,可以在多种操作系统上使用,包括Linux、Windows和macOS。

常用接口介绍:

  • zip_open:用于打开一个 zip 文件。如果文件不存在,可以设置相应的标志来创建一个新的 zip 文件。
  • zip_close:关闭一个 zip 文件,并写入所有的更改。
  • zip_source_buffer:从内存缓冲区创建一个数据源,这个数据源可以用来向 zip 文件中添加内容。
  • zip_file_add:向 zip 文件中添加一个新的文件。
  • zip_fopen:打开 zip 文件中的一个文件,以便读取。
  • zip_fread:从打开的 zip 文件中读取数据。
  • zip_stat:获取 zip 文件中一个文件的信息,例如大小、修改时间。
  • zip_get_num_entries:获取 zip 文件中的条目数量

2.环境搭建

下载地址:https://github.com/nih-at/libzip

编译源码:
在这里插入图片描述
需要先编译zlib库,请看压缩和归档库-Zlib介绍

在cmake中需要指定zlib库的路径。
在这里插入图片描述
编译完成,生成libzip库。
在这里插入图片描述
从源码中拷贝zlib.h和zconf.h头文件以及生成的库到我们的demo目录中。
配置visual studio环境,请看Jsoncpp介绍。

3.示例

压缩/解压zip文件。

#include <zip.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <windows.h>

void compress(const std::vector<std::string>& filenames, const std::string& zipFilename)
{
	int error = 0;
	zip_t* zip = zip_open(zipFilename.c_str(), ZIP_CREATE | ZIP_EXCL, &error);

	if (zip == nullptr) 
	{
		zip_error_t ziperror;
		zip_error_init_with_code(&ziperror, error);
		std::cerr << "Failed to open output file " << zipFilename << ": " << zip_error_strerror(&ziperror) << std::endl;
		zip_error_fini(&ziperror);
		return;
	}

	for (const auto& filename : filenames) 
	{
		std::ifstream file(filename, std::ios::binary);
		std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(file), {});

		zip_source_t* source = zip_source_buffer(zip, buffer.data(), buffer.size(), 0);
		if (source == nullptr)
		{
			std::cerr << "Failed to create zip source for " << filename << std::endl;
			continue;
		}

		if (zip_file_add(zip, filename.c_str(), source, ZIP_FL_OVERWRITE) < 0) 
		{
			std::cerr << "Failed to add file " << filename << " to zip: " << zip_strerror(zip) << std::endl;
			zip_source_free(source);
		}
	}

	zip_close(zip);
}

void decompress(const std::string& zipFilename, const std::string& outputFolder)
{
	//没有目录先创建目录。
	int error;
	zip_t* zip = zip_open(zipFilename.c_str(), 0, &error);
	if (zip == nullptr)
	{
		zip_error_t ziperror;
		zip_error_init_with_code(&ziperror, error);
		std::cerr << "Failed to open zip file " << zipFilename << ": " << zip_error_strerror(&ziperror) << std::endl;
		zip_error_fini(&ziperror);
		return;
	}

	zip_int64_t numEntries = zip_get_num_entries(zip, 0);
	for (zip_int64_t i = 0; i < numEntries; i++) 
	{
		zip_file_t* zfile = zip_fopen_index(zip, i, 0);
		zip_stat_t zstat;
		zip_stat_index(zip, i, 0, &zstat);

		std::string outputPath = outputFolder + "/" + zstat.name;
		std::ofstream outputFile(outputPath, std::ios::binary);

		std::vector<char> buffer(zstat.size);
		zip_fread(zfile, buffer.data(), buffer.size());
		outputFile.write(buffer.data(), buffer.size());
	}

	zip_close(zip);
}

int main() {
	const char* zip_filename = "./example.zip";

	std::vector<std::string> filenames;
	filenames.push_back("./test1.txt");
	filenames.push_back("./zip.dll");

	// 压缩文件
	compress(filenames, zip_filename);

	// 解压缩文件
	decompress(zip_filename, "./d");
	
	return 0;
}

4.更多参考

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

JSON++介绍

RapidJSON介绍

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5月9日作业

1&#xff0c;创建一对父子进程&#xff1a;父进程负责向文件中写入 长方形的长和宽子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积。 1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #…

10. Django Auth认证系统

10. Auth认证系统 Django除了内置的Admin后台系统之外, 还内置了Auth认证系统. 整个Auth认证系统可分为三大部分: 用户信息, 用户权限和用户组, 在数据库中分别对应数据表auth_user, auth_permission和auth_group.10.1 内置User实现用户管理 用户管理是网站必备的功能之一, D…

【ETAS CP AUTOSAR工具链】RTA-OS基本概念与开发流程

RTA-OS基于早期ETAS操作系统的成熟技术&#xff0c;迄今为止&#xff0c;已在全球超过3.5亿个ECU中使用。RTA-OS是一个可静态配置的抢占式实时操作系统(RTOS)&#xff0c;它常被用于资源受限但有着高性能要求的方案中。内核的实现不仅遵循了AUTOSAR R3.x、R4.0、R4.1、R4.2、R4…

刷题《面试经典150题》(第九天)

加油&#xff01; 学习目标&#xff1a;学习内容&#xff1a;学习时间&#xff1a;知识点学习内容&#xff1a;跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09;H 指数 - 力扣&#xff08;LeetCode&#xff09;盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09;矩阵置…

全平台 GUI库, 物联网,嵌入式,单片机,桌面应用都行

跨平台最小头文件GUI库 GuiLite是一个轻量级、高效的GUI库&#xff0c;拥有仅4千行的C代码&#xff0c;且零依赖&#xff0c;采用单一头文件库&#xff08;GuiLite.h&#xff09;。这个库不仅提供高效渲染&#xff0c;即使在单片机上也能流畅运行&#xff0c;展现了卓越的性能表…

Power BI 可以取代 Excel 吗?

首先说明&#xff0c;Power BI并不能完全取代Excel。 Power BI和Excel虽然都是Microsoft推出的数据工具&#xff0c;但他们的设计目标并不相同&#xff0c;因此它们在数据分析和处理方面各自有独特的优势。两者更多是互补关系。 在做报表可视化方面Power BI确实优势明显&…

人脸可调色美颜SDK解决方案,让妆容更加自然、真实

在追求个性化和差异化的美妆时代&#xff0c;美摄科技以其前沿技术&#xff0c;为企业带来了一场美妆革新的风暴。我们全新推出的人脸可调色美颜SDK解决方案&#xff0c;将为您提供前所未有的美妆体验&#xff0c;让每一位用户都能轻松打造属于自己的独特妆容。 可调色技术&am…

JavaScript算法描述【排序与搜索】六大经典排序|搜索旋转排序数组|在排序数组中查找元素的第一个和最后一个位置、数组中的第K个|

&#x1f427;主页详情&#xff1a;Choice~的个人主页 文章目录 搜索旋转排序数组方法一 二分查询最大最小值思路详解代码方法二 二分查询中间数 在排序数组中查找元素的第一个和最后一个位置、数组中的第K个最大元素和颜色分类在排序数组中查找元素的第一个和最后一个位置方法…

day-31 给植物浇水

思路 每次前进浇水时进行判断&#xff1a; &#xff08;1&#xff09;如果当前水足够&#xff0c;则前进一步浇水 &#xff08;2&#xff09;如果当前水量不够,则返回-1处加水再返回&#xff0c;再前进一步浇水 解题方法 用一个变量po记录即将浇水的植物编号&#xff0c;当pop…

05-09 周四 vLLM的部署和实践

05-09 周四 vLLM能够做什么事情 时间版本修改人描述2024年5月9日14:33:05V0.1宋全恒新建文档 简介 GitHub项目 vllm-project 官方网站上解释了Fast、和flexible and easy to use的原因。 注&#xff0c;如果要使用ModelScope中的模型&#xff0c;请设置环境变量&#xff1a; e…

深度学习——前馈全连接神经网络(鸢尾花)

前馈全连接神经网络对鸢尾花数据集进行分类 1.导入所需要的包2.打印训练集和测试集二维数组3.定义模型4.打印模型信息5.权重和偏执6.编译网络和训练网络7.打印二维数据表格8.绘制图像9.查看准确率 1.鸢尾花数据集可以用 from sklearn.datasets import load_iris 方式获取&#…

汽车行业芯片 车规级芯片 单车芯片( soc mcu)数量

链接&#xff1a;https://xueqiu.com/3000217281/272114755 10大车规级MCU芯片10大车规级MCU芯片 汽车芯片是什么&#xff1f; 汽车芯片即车规级芯片&#xff0c;标准要高于工业级和民用级芯片&#xff0c;仅次于军工级芯片。芯片大概有以下四种级别&#xff0c;分别是军工级…

基于OceanBase+Flink CDC,云粒智慧实时数仓演进之路

摘要&#xff1a;本文整理自云粒智慧高级技术专家付大伟在 4 月 20 日的 2024 OceanBase 开发者大会上的分享&#xff0c;讲述了其数据中台在传统数仓技术框架下做的一系列努力后&#xff0c;跨进 FlinkCDC 结合 OceanBase 的实时数仓演进过程。 内容主要分为以下几个部分: 业务…

2023年ICPC亚洲济南地区赛 G. Gifts from Knowledge

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5, b…

一步一脚印式学习Linux第二课(简单明了)

继续昨天的基础命令&#xff0c;正文如下&#xff1a; 六、基础命令 8.history命令 作用&#xff1a;查看和控制历史记录 历史命令保存位置&#xff1a;~/.bash_history 启动终端时&#xff0c;会自动从历史命令保存位置的文件中读取历史命令加载到内存中。终端中执行命令时&…

视频降噪算法 hqdn3d 原理分析

视频降噪 视频降噪是一种处理技术&#xff0c;旨在减少视频中的噪声&#xff0c;提高画面质量。噪声可能来自多种源头&#xff0c;包括摄像机的传感器、压缩算法、传输过程中的干扰等。降噪处理对于视频监控、视频会议、电影后期制作以及任何需要高画质输出的应用场景都非常重…

msvcp110.dll是什么东西?关于msvcp110.dll丢失修复的问题分享

msvcp110.dll是什么东西&#xff1f;如果有人问出这个问题&#xff0c;那么百分之一百就是他遇到了丢失msvcp110.dll文件的问题了&#xff0c;不然别人是不可能问出这个问题的&#xff01;这个文件名字一般只有在你的电脑系统出现问题的时候&#xff0c;它才会弹出提示。今天来…

Baidu Comate智能编码助手

Baidu Comate智能编码助手 &#x1f388;1.Baidu Comate的简介&#x1f388;2.安装Baidu Comate&#x1f388;3.Baidu Comate实现功能&#x1f388;4.使用注释进行智能代码提示&#x1f388;5.结束语 &#x1f388;1.Baidu Comate的简介 根据官网的介绍&#xff0c;我们了解到B…

Verilog复习(一)| 模块的定义

模块&#xff08;module&#xff09;是Verilog的基本描述单位&#xff0c;用于描述某个设计的功能或结构&#xff0c;及其与其他模块通信&#xff08;连接&#xff09;的外部端口。 Verilog程序由关键词module和endmodule进行定义。 定义模块的步骤&#xff1a; 定义模块的端…

通用型产品发布解决方案(基础环境搭建)

文章目录 1.项目技术栈和前置技术2.创建Linux平台1.需求分析2.安装Virtual Box1.BIOS里修改设置开启虚拟化设备支持&#xff08;f2 或f10&#xff09;2.任务管理器 -> cpu 查看虚拟化是否开启3.卸载方式4.安装6.1.265.管理员身份运行&#xff0c;选择安装位置6.一直下一步&a…