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