Zip压缩归档库-libzip介绍

2024-05-10 10:04

本文主要是介绍Zip压缩归档库-libzip介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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介绍

这篇关于Zip压缩归档库-libzip介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/976128

相关文章

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML