这段信息是在介绍 TuNzIp(Tiny Unzip)压缩库 的基本用法,它是一个轻量级的 ZIP 解压工具库,经常用在 Windows C++ 项目中,基于 Phil Katz(ZIP 格式的发明者) 所定义的 .zip
文件格式。
📦 TuNzIp 核心函数说明
函数名 | 功能解释 |
---|---|
OpenZip(const TCHAR* fn, const char* password) | 打开一个 ZIP 文件,返回句柄 HZIP ,可选密码 |
GetZipItem(HZIP hz, int index, ZIPENTRY* ze) | 获取 ZIP 文件中某一项的元数据(如文件名、大小) |
FindZipItem(HZIP hz, const TCHAR* name, bool ic, int* index, ZIPENTRY* ze) | 按文件名查找 ZIP 中的项目,返回索引和信息 |
UnzipItem(HZIP hz, int index, const TCHAR* fn) | 解压指定索引的 ZIP 项目,写到文件 |
UnzipItem(HZIP hz, int index, void* z, UINT len) | 解压项目到内存(指定 buffer) |
UnzipItemHandle(HZIP hz, int index, HANDLE h) | 解压项目到指定文件句柄 |
SetUnzipBaseDir(HZIP hz, const TCHAR* dir) | 设置默认解压输出目录 |
CloseZip(HZIP hz) | 关闭 ZIP 文件,释放资源 |
FormatZipMessage(ZRESULT code, TCHAR* buf, UINT len) | 将错误码转换为文字信息 |
🧪 示例:解压 ZIP 文件中所有内容
#include "unzip.h" // 你需要包含 TuNzIp 的头文件
#include <tchar.h>
#include <windows.h>
#include <iostream>
int main() {
// 1. 打开 ZIP 文件
HZIP hz = OpenZip(_T("example.zip"), 0); // 没有密码
if (!hz) {
std::cout << "无法打开 ZIP 文件" << std::endl;
return 1;
}
// 2. 设置解压目标路径(可选)
SetUnzipBaseDir(hz, _T("output")); // 解压到 output 文件夹
// 3. 获取项目总数
ZIPENTRY ze;
ZRESULT zr = GetZipItem(hz, -1, &ze); // index = -1 表示“总数”
int num_items = ze.index;
// 4. 遍历并解压每个项目
for (int i = 0; i < num_items; ++i) {
zr = GetZipItem(hz, i, &ze); // 获取第 i 项元数据
UnzipItem(hz, i, ze.name); // 解压到当前目录
std::wcout << L"解压文件: " << ze.name << std::endl;
}
// 5. 关闭 ZIP 文件
CloseZip(hz);
return 0;
}
📌 补充说明
-
TCHAR
是 Windows 中的类型宏,支持 Unicode(wchar_t
)和 ANSI(char
)两种模式。 -
你需要链接
unzip.lib
,并包含 TuNzIp 提供的unzip.h
和实现文件。 -
有些版本也叫做
minizip
或zip_utils
,实现类似。
🔧 常见用法场景
场景 | 使用函数 |
---|---|
解压所有文件到某个文件夹 | OpenZip + SetUnzipBaseDir + UnzipItem |
解压特定文件 | FindZipItem + UnzipItem |
解压到内存(用于嵌入式) | UnzipItem(..., void* buffer) |
查看 ZIP 中包含什么 | GetZipItem (循环) |
ZIP 格式发展路径概览
🔶 1. 初代压缩格式:ARC(1980年代初)
-
开发者:Thom Henderson(System Enhancement Associates,SEA 公司)
-
特点:
-
DOS 上早期压缩格式(
.arc
) -
既能压缩又能归档(archive)多个文件
-
-
命令行工具:
ARC
,广泛用于 BBS(早期在线社区)
🔶 2. Phil Katz 出场:PKARC 与 PKXARC(1986)
-
人物:Phil Katz(美国程序员,1962–2000)
-
公司:PKWARE, Inc.
-
创新:
-
开发了兼容 ARC 的更快工具:
PKARC
(压缩) 和PKXARC
(解压) -
使用汇编语言优化性能,速度大幅优于 ARC
-
-
争议:
-
SEA 控告 PKWARE 侵权,最后和解
-
Phil Katz 决定从头设计新的压缩格式 → ZIP
-
🔶 3. ZIP 格式诞生(1989)
-
格式名称:ZIP(名字来自“快速拉链”的比喻)
-
工具:
PKZIP
和PKUNZIP
-
技术特征:
-
支持多个文件
-
支持压缩与不压缩混合存储
-
添加了目录结构、文件注释等元数据
-
-
开放格式:
-
虽由 PKWARE 首创,但
.zip
格式规范是开放的 -
大量软件开始支持(如 WinZip、7-Zip、Info-ZIP 等)
-
🔶 4. ZIP 格式标准化与扩展(1990s–2000s)
-
ZIP 2.0:成为事实标准(支持密码、分卷等)
-
ZIP64:突破 4GB 文件和 65535 文件限制
-
Deflate 算法:成为默认压缩方法(后来被 GZIP、HTTP 等广泛采用)
-
兼容平台:Windows, Linux, macOS, Android, iOS
🔶 5. TinyZip / TuNzIp / MiniZip(轻量实现)
-
背景:
-
随着嵌入式和移动开发普及,需要轻量级 ZIP 库
-
-
代表项目:
-
TuNzIp:C/C++ 下极简压缩解压库,常见于 Windows 项目
-
MiniZip:来自 zlib 的官方 ZIP 扩展,支持读写 .zip 文件
-
unzip.c / zip.c:Info-ZIP 开源工具,功能完善
-
🔶 6. 现代压缩格式对比(演进)
格式 | 开发者 | 特点 |
---|---|---|
ZIP | PKWARE | 广泛支持,兼容好 |
7Z | 7-Zip | 压缩率高,解压慢 |
RAR | WinRAR | 商业授权,支持恢复记录 |
TAR.GZ | GNU | Linux 常用,分开归档+压缩 |
📌 ZIP 技术的 3 个核心特征
-
归档(Archive)功能:多个文件+目录结构→一个
.zip
文件 -
压缩功能(可选):使用 DEFLATE 算法进行无损压缩
-
文件目录表(Central Directory):支持快速访问与索引
💡 ZIP 为什么能成为事实标准?
-
开放格式,容易实现
-
DOS → Windows 平滑过渡(PKZIP / WinZip / 资源管理器直接支持)
-
与 Internet 文件传输结合(邮件、网页压缩包)
-
大量开源实现:Info-ZIP、zlib、7-Zip、TuNzIp 等
ZIP 文件的内部结构
一个 ZIP 文件大致由以下三部分组成:
[ 文件1数据块 ] [ 文件2数据块 ] ... [ 中央目录区 ] [ 目录结束标志 ]
部分 | 作用 |
---|---|
文件数据块 | 存储每个被压缩的文件 |
中央目录区 | 存储所有文件的信息索引(类似目录) |
目录结束标志 | 标记 ZIP 文件的结尾 |
每个文件的元信息包含:
-
文件名
-
压缩方法(如 deflate)
-
原始大小、压缩后大小
-
文件在 ZIP 中的位置偏移量
总结一句话
如果你追求 兼容性 → 用 ZIP;
如果你追求 压缩率 → 用 7Z、XZ、Zstd;
如果你追求 速度 → 用 Zstd、LZ4、Snappy。