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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值