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

相关推荐

  1. 7-Zip压缩软件功能介绍

    2024-05-10 05:26:01       12 阅读
  2. c# Zip压缩压缩

    2024-05-10 05:26:01       31 阅读
  3. zip压缩工具类

    2024-05-10 05:26:01       28 阅读
  4. zip压缩

    2024-05-10 05:26:01       25 阅读
  5. centos如何压缩zip

    2024-05-10 05:26:01       8 阅读
  6. 【linux】压缩包管理-ZIP

    2024-05-10 05:26:01       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 05:26:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 05:26:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 05:26:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 05:26:01       18 阅读

热门阅读

  1. 石家庄河北银行的

    2024-05-10 05:26:01       11 阅读
  2. golang学习

    2024-05-10 05:26:01       10 阅读
  3. 有关while((c=getchar())!=\n)和while((ch=getchar()!=EOF))

    2024-05-10 05:26:01       10 阅读
  4. 令牌桶和漏桶算法的区别

    2024-05-10 05:26:01       12 阅读
  5. 双网口扩展IO支持8DO输出

    2024-05-10 05:26:01       12 阅读
  6. .Net WinFrom中DataGridView控件的熟练学习

    2024-05-10 05:26:01       10 阅读
  7. Go中json的解析和反解析

    2024-05-10 05:26:01       8 阅读
  8. 【Android】EventBus收不到消息的一种情况

    2024-05-10 05:26:01       11 阅读
  9. 深入理解nginx中的signal处理机制

    2024-05-10 05:26:01       11 阅读
  10. 等保测评—Linux核查指令3

    2024-05-10 05:26:01       11 阅读
  11. 2024.5.2 —— LeetCode 高频题复盘

    2024-05-10 05:26:01       13 阅读