在 C++ 中处理 ZIP/压缩包:库概述与实践示例
数据压缩是软件开发中的关键任务之一。C++ 本身没有对 ZIP 格式的内置支持,但存在几个成熟且经过验证的库,可以轻松地打包、解包和修改 ZIP 压缩包。在本文中,我们将介绍主要工具:zlib、minizip 和 libzip,并提供实用的代码示例。
1. C++ 中处理 ZIP 的基本概念
ZIP 是一种无损压缩格式,支持多种算法(Deflate、BZip2、LZMA)。在 C++ 中处理它通常使用三种方法:
- 直接使用 zlib — 底层数据流压缩/解压缩,但不支持 ZIP 文件结构。
- minizip — 基于 zlib 的封装,提供创建和读取 ZIP 压缩包的功能。
- libzip — 功能齐全的库,支持编辑、删除和向现有压缩包中添加文件。
2. zlib 库
zlib 是一个基础的压缩库,许多 ZIP 解决方案都构建在其之上。它提供了 compress() 和 uncompress() 函数用于处理原始数据。
示例:使用 zlib 压缩字符串
#include <iostream>#include <string>#include <zlib.h>
int main() { std::string input = "用于在 C++ 中压缩的示例文本!"; uLong srcLen = input.size(); uLong destLen = compressBound(srcLen); char* compressed = new char[destLen]; if (compress((Bytef*)compressed, &destLen, (const Bytef*)input.data(), srcLen) == Z_OK) { std::cout << "已压缩: " << srcLen << " -> " << destLen << " 字节"; } delete[] compressed; return 0;}注意: 使用 zlib 需要包含头文件 zlib.h 并链接库 -lz。
3. minizip 库
minizip 是一个轻量级的 zlib 封装,允许创建和提取 ZIP 压缩包。它随 zlib 源码一起分发(位于 contrib/minizip 文件夹)。
示例:创建一个包含单个文件的 ZIP 压缩包
#include <iostream>#include <zip.h> // minizip
int main() { zipFile zf = zipOpen("example.zip", APPEND_STATUS_CREATE); if (!zf) { std::cerr << "创建压缩包失败"; return 1; } zip_fileinfo info = {0}; const char* filename = "test.txt"; const char* content = "来自 minizip 的问候!"; if (zipOpenNewFileInZip(zf, filename, &info, nullptr, 0, nullptr, 0, nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION) == ZIP_OK) { zipWriteInFileInZip(zf, content, strlen(content)); zipCloseFileInZip(zf); } zipClose(zf, nullptr); std::cout << "压缩包已创建: example.zip"; return 0;}示例:从 ZIP 压缩包中提取所有文件
#include <iostream>#include <unzip.h>
int main() { unzFile uf = unzOpen("example.zip"); if (!uf) { std::cerr << "无法打开压缩包"; return 1; } unz_global_info global_info; unzGetGlobalInfo(uf, &global_info); for (uLong i = 0; i < global_info.number_entry; ++i) { char filename[256]; unz_file_info file_info; unzGetCurrentFileInfo(uf, &file_info, filename, sizeof(filename), nullptr, 0, nullptr, 0); if (unzOpenCurrentFile(uf) == UNZ_OK) { c