TuNzIp(Tiny Unzip)压缩库 的基本用法

这段信息是在介绍 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 和实现文件。

  • 有些版本也叫做 minizipzip_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(名字来自“快速拉链”的比喻)

  • 工具PKZIPPKUNZIP

  • 技术特征

    • 支持多个文件

    • 支持压缩与不压缩混合存储

    • 添加了目录结构、文件注释等元数据

  • 开放格式

    • 虽由 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. 现代压缩格式对比(演进)

格式开发者特点
ZIPPKWARE广泛支持,兼容好
7Z7-Zip压缩率高,解压慢
RARWinRAR商业授权,支持恢复记录
TAR.GZGNULinux 常用,分开归档+压缩

📌 ZIP 技术的 3 个核心特征

  1. 归档(Archive)功能:多个文件+目录结构→一个 .zip 文件

  2. 压缩功能(可选):使用 DEFLATE 算法进行无损压缩

  3. 文件目录表(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值