HatchZipCLI + GUI
原地归档解压引擎 // MIT OR Apache-2.0 开源许可

原地解压超大压缩包,无需双倍磁盘空间。

一个 180 GB 的压缩包解压出 200 GB 文件时,使用 WinRAR、7-Zip 或 unzip 需要 380 GB 磁盘空间,因为压缩包与解压出的所有文件必须同时存在于磁盘上。HatchZip 只需要略多于 200 GB 的空间:它从归档末尾向前提取,每完成一批文件就将该部分从归档文件中裁切掉,实时腾出磁盘空间。

免费且开源,支持 Windows、macOS 和 Linux。同时提供原生桌面图形界面(支持系统右键菜单直接解压)与 hatchzip(简写 hz)命令行工具。

桌面版安装包直链下载查看全部版本与校验和 →
curl -fsSL https://raw.githubusercontent.com/xevrion/hatchzip/main/install.sh | sh

未签名提示:HatchZip 目前尚未购买商业代码签名证书。Windows 若弹出“Windows 已保护你的电脑”,请点击“更多信息”→“仍要运行”;macOS 首次打开后,请在“系统设置 → 隐私与安全性”中点击允许。 旧款 Intel 芯片 Mac 请下载 Intel 版 .dmg。

01 // 核心架构

工作原理与崩溃安全机制

为什么 HatchZip 从文件末尾倒序提取、.tar.gz 如何通过稀疏文件打洞(Hole Punching)从头部流式释放空间,以及断电/崩溃如何做到零数据丢失。

ftruncate / SetEndOfFile

尾部倒序截断(ZIP、7z、tar、.001 分卷)

所有操作系统和文件系统(包括 FAT32 与 exFAT)都原生支持从文件末尾截断缩短。ZIP 和 7z 的索引位于文件最末尾,因此 HatchZip 先将尾部索引备份至 <archive>.hatchzip-tail,随后从最后一个独立单元(文件或固实块)开始倒序解压,每提交一批就截断归档尾部。

fallocate / F_PUNCHHOLE / FSCTL_SET_SPARSE

正向流式打洞(.tar.gz 与 ≥512 MiB 单体大文件)

.tar.gz 是只能从头解码的单一压缩流。HatchZip 在修改任何数据前会先从头到尾完整读取一遍以校验所有 gzip CRC-32(损坏归档直接原样拒绝);随后从头向后解压,每输出 256 MiB 在 deflate 块边界记录恢复点(含 32 KiB 滑动窗口),并在 NTFS、APFS、ext4、XFS、btrfs 上通过文件打洞释放已解码的压缩字节。

--keep-free 2GB

前置空间沙盘预演与 2 GB 保底余量

在触碰第一个字节前,HatchZip 会完整推演整个解压批次,精确计算峰值所需空间(输出体积 + 最大单一解压单元或固实块)。默认保留 2 GB 可用空间(可通过 --keep-free 调整),防止系统盘被彻底写满。

绝不覆盖已有文件

逐文件 CRC-32 校验与恶意归档防御

每个文件在解压时实时校验 CRC-32;若发现损坏立即停止,损坏文件及其前面的数据仍安全保留在归档中。从不覆盖已存在的文件;对目录穿越(..)、重叠条目、重复路径及 setuid/setgid 权限直接拒绝;符号链接一律在所有普通文件写完后才创建。

单批次五步原子协议(任意时刻崩溃均可安全恢复)

步骤 01规划当前批次

从尾部未提交单元起,在扣除 --keep-free 后的当前可用空间内选取单元(单批次上限 512 个单元或 2 GB)。

步骤 02多线程并行解码

工作线程并行解压至 <name>.hatchzip-part 临时文件,校验 CRC-32 与声明长度无误后重命名为正式文件名。

步骤 03物理落盘同步

强制将批次数据刷入物理磁盘:Linux 调用一次 syncfs,macOS 调用 F_FULLFSYNC,其他系统逐文件与目录执行 fsync。

步骤 04原子日志提交

将新的 committed_len 与链接信息写入临时日志,落盘后原子替换 <archive>.hatchzip 并刷新目录项。

步骤 05截断释放归档

将归档文件截断至 committed_len(或删除已排空的分卷文件),释放出的磁盘块立即供下一批次复用。

FIG 01 // IN-PLACE EXTRACTIONhow.webp
原理演示:HatchZip 先将归档末尾部分提取到目标文件夹,随后将该部分从归档文件中裁切掉,磁盘无需同时容纳完整归档与全部解压文件。
原理演示:HatchZip 先将归档末尾部分提取到目标文件夹,随后将该部分从归档文件中裁切掉,磁盘无需同时容纳完整归档与全部解压文件。
FIG 02 // DESKTOP GUI & SPACE PLANhatchzip-gui
HatchZip 桌面端界面:左侧展示归档内文件列表,右侧直观对比标准解压与 HatchZip 原地解压所需的磁盘空间。HatchZip 桌面端界面:左侧展示归档内文件列表,右侧直观对比标准解压与 HatchZip 原地解压所需的磁盘空间。
HatchZip 桌面端界面:左侧展示归档内文件列表,右侧直观对比标准解压与 HatchZip 原地解压所需的磁盘空间。
02 // 下载与命令行

安装包下载与 CLI 命令手册

既可通过桌面应用与系统右键菜单“Extract here”零门槛使用,也可在终端使用 hatchzip(或短别名 hz)完成自动化处理。

桌面版三步上手
  1. 安装应用。由于暂未进行商业代码签名,Windows 弹出提示时请选择“更多信息”→“仍要运行”;macOS 请先打开一次应用,随后在“系统设置 → 隐私与安全性”中点击允许。
  2. 右键点击压缩包,选择 HatchZip → Extract here(Windows 与 Linux 支持;Windows 11 位于“显示更多选项”中)。
  3. 或者打开 HatchZip 桌面程序,打开或拖入压缩包,确认右侧空间预检通过后点击 Extract。
桌面端应用程序(安装时会自动将 hatchzip 与 hz 加入 PATH)
系统平台安装包 / 文件名类型与说明
Windows 10 & 11 (x64)HatchZip-x64-setup.exe安装程序(当前用户安装,无需管理员权限,自动注册右键菜单)
macOS Apple Silicon (M1 及更新)HatchZip-aarch64.dmg磁盘映像 (.dmg)
macOS IntelHatchZip-x86_64.dmg磁盘映像 (.dmg)
Linux x64 (通用发行版)HatchZip-x86_64.AppImageAppImage 单文件应用
Debian / Ubuntu (x64)hatchzip_amd64.debdeb 软件包
Fedora / openSUSE (x64)hatchzip-x86_64.rpmrpm 软件包
独立命令行工具归档包
系统平台安装包 / 文件名类型与说明
Windows x64hatchzip-x86_64-windows.zipzip
macOS Apple Siliconhatchzip-aarch64-macos.tar.gztar.gz
macOS Intelhatchzip-x86_64-macos.tar.gztar.gz
Linux x64hatchzip-x86_64-linux.tar.gztar.gz
Linux ARM64hatchzip-aarch64-linux.tar.gztar.gz

终端一键安装(自动校验 SHA-256,仅安装至当前用户,无需 root/管理员权限)

Linux / macOS (sh)
curl -fsSL https://raw.githubusercontent.com/xevrion/hatchzip/main/install.sh | sh
Windows (PowerShell)
irm https://raw.githubusercontent.com/xevrion/hatchzip/main/install.ps1 | iex
Rust (Cargo)
cargo install hatchzip
1. 预检磁盘空间是否足够(不修改任何文件)
$ hatchzip check game.zip
game.zip  180.2 MB zip, 200.0 MB uncompressed in 22 entries
  available                    50.5 MB
  standard extraction needs    200.0 MB
  required                     29.9 MB (+5.0 MB reserved)
  available after              30.6 MB
2. 原地解压、分卷归档解压或指定输出目录
$ hatchzip extract game.zip                 # 解压至 ./game/ 并随进度移除原压缩包
$ hatchzip extract game.zip -o D:\Games\Foo # 解压至指定目录
$ hatchzip x game.7z.001                    # 解压分卷压缩包(传入任意分卷文件名即可识别整组)
$ hatchzip extract rare.zip --verify-first  # 在删除任何字节前先完整读取并校验所有文件校验和
3. 暂停续传、崩溃恢复或还原半解压归档
$ hatchzip extract game.zip   # 按 Ctrl+C 暂停或断电重启后,再次执行同一命令即可接着解压
$ hatchzip restore game.zip   # 放弃继续解压:为剩余未解压条目重写索引,恢复为 7-Zip/unzip 可正常打开的归档
$ hatchzip list game.7z       # 查看归档内文件列表与体积(不做任何修改)
$ hatchzip test game.7z       # 完整读取并验证所有文件校验和(不写入任何文件)
常用命令行参数与环境变量
参数 / 环境变量作用说明
-o, --output <dir>指定输出文件夹。默认为归档同级目录下的同名文件夹(必须为空目录或尚不存在)。
--keep-free <size>设置 HatchZip 绝不占用的磁盘保底剩余空间(如 500MB、10GB),默认值为 2GB。
--verify-first在截断删除任何归档字节前,先完整读取归档并校验所有文件。适合无法重新下载的重要归档。
-y, --yes跳过交互式确认提示(非终端脚本调用时必传)。
--password / HATCHZIP_PASSWORD解密受密码保护的 ZIP(ZipCrypto/AES)与 7z(AES,含加密文件名列表)。会在删除任何数据前先用单个文件验证密码,且绝不落盘保存密码。
命令行退出状态码(Exit Codes)
状态码含义说明
0成功完成解压或检查。
1运行出错。若解压已开始,已完成批次的进度已安全保存在 .hatchzip 中。
2命令行参数或用法无效。
3剩余磁盘空间不足(未对归档做任何修改)。
4归档损坏或含危险路径被拒绝(未删除任何数据)。
5需要密码或提供的密码错误。
130通过 Ctrl+C 手动暂停。再次运行相同命令即可继续。
03 // 实测结果

真实环境基准测试

使用真实工具打包的 200 MB 游戏数据(共 21 个文件),在仅剩约 50 MB 可用空间的 220 MiB 磁盘上进行极限解压测试。

200 MB 游戏数据(21 个文件)在 220 MiB 磁盘(约 50 MB 可用空间)上的表现对比
测试归档样本unzip / 7-ZipHatchZip 实测结果
ZIP,180 MB[FAIL]unzip 在第 6/21 个文件处因空间耗尽失败[PASS]顺利完成,所有文件逐字节完全一致
7z (7-Zip 25.01, -ms=20m, 10 个固实块)[FAIL]需要 380 MB 空间[PASS]0.64 秒完成,所有文件逐字节完全一致
7z 分卷归档(5 个 40 MB 分卷)[FAIL]需要 380 MB 空间[PASS]顺利完成;分卷逐个清空删除,峰值仅占用 210 MB
GNU tar 归档,200 MB[FAIL]需要 400 MB 空间[PASS]0.12 秒完成,所有文件逐字节完全一致
7z 默认参数(整个归档为 1 个固实块)[FAIL]需要 380 MB 空间[SAFE REFUSAL]在修改任何数据前安全拒绝:单个固实块必须全部解压完才能释放,因此需要 200 MB 可用空间
ZIP 并行解压耗时 (ext4)0.25 – 0.35 秒

同样数据下 unzip 6.00 耗时 1.48 – 1.50 秒,且 HatchZip 包含了 unzip 跳过的 fsync 落盘操作。(由多核并行解压加速;若归档内仅单个超大文件则为单核解码速度。)

单个 600 MiB ZIP 条目打洞流式解压仅需 367 MB 可用空间

在支持稀疏文件打洞的文件系统上,每 256 MiB 释放一次归档字节,在 950 MiB tmpfs 上仅凭 367 MB 剩余空间完成解压(未启用流式打洞前需 629 MB)。

崩溃注入测试(Crash Safety)100% 字节级一致恢复

在每种格式运行过程中的多个批次临界不安全时刻强制杀死进程,所有续传均成功完成且输出逐字节一致。

测试环境:Fedora 43,Intel Core i7-14700HX,SK Hynix NVMe SSD,热页缓存(warm page cache);磁盘空间测试使用 220 MiB tmpfs 模拟接近写满的笔记本硬盘,速度测试在 ext4 上执行。

04 // 格式与限制

支持格式、文件系统与已知边界

透明列出每种格式的空间释放粒度、各系统底层打洞系统调用,以及当前尚未支持的边界场景。

归档格式支持矩阵与空间释放粒度
归档格式支持详情空间释放步长(粒度)
ZIP、ZIP64、自解压 .exe已支持。已测试:Stored、Deflate、Deflate64、bzip2、LZMA、PPMd、Zstandard 及超过 4 GiB 的条目。按单个文件(对于 ≥512 MiB 的 Stored/Deflate 文件支持按 256 MiB 打洞释放)
7z(固实与非固实)已支持。已通过 7-Zip 25.01 测试:LZMA2(默认)、LZMA、BCJ+LZMA2、bzip2、Deflate、PPMd。按单个固实块(非固实归档按单个文件)
tar(未压缩)已支持,包含超长文件名、符号链接与硬链接。按单个文件(对于 ≥512 MiB 的文件支持按 256 MiB 打洞释放)
.tar.gz / .tgz(含 pigz / bgzip 及 .tar.gz.001 分卷)已支持。修改前先从头到尾读取校验一遍;在 NTFS、APFS、ext4、XFS、btrfs 上边解压边打洞释放空间。在 FAT32/exFAT 上仍可解压和断点续传,但需同时容纳归档与文件的空间。每输出 256 MiB 释放一次
分卷归档(.001, .002, …,ZIP 或 7z)已支持(7-Zip 生成的字节切分分卷)。按文件或固实块;每个分卷一旦排空立即删除
密码保护的 ZIP 与 7z已支持(ZipCrypto、ZIP AES、7z AES 含加密文件列表)。在删除任何数据前先抽取一个文件验证密码。与未加密归档一致
.tar.zst、.tar.xz、RAR、原生 .z01 分卷 ZIP暂不支持 — 会在开始前安全拒绝,不修改任何文件。规划中

使用前需了解的客观限制

[LIMIT]

单固实块 7z 归档(7-Zip 默认配置)

使用 7-Zip 默认设置生成的 7z 往往将所有文件压缩进同一个固实块(1 solid block)。由于固实块必须完整解码后才能释放,因此需要足以容纳整个固实块的剩余空间。运行 hatchzip check 会在修改任何文件前提前告知。

[LIMIT]

原归档在解压过程中被消耗(不可重下文件请加 --verify-first)

HatchZip 边解压边截断原归档。如果下载的压缩包本身在中间某处损坏,损坏位置之前的文件会被解压出来,而归档已部分被截断。对于无法重新下载的珍贵文件,请加上 --verify-first 先全量校验再原地解压。

[LIMIT]

未完成解压前请勿删除 .hatchzip 与 .hatchzip-tail

当解压暂停或中断时,同级目录下的 <archive>.hatchzip 和 <archive>.hatchzip-tail 保存着已从归档末尾裁切掉的目录索引。在解压彻底完成或执行 hatchzip restore 之前,请勿手动删除这两个文件。

[LIMIT]

写时复制快照(btrfs / APFS)与 FAT32 / exFAT

在 btrfs 或 APFS 等支持快照的文件系统上,若原归档已被包含在某个快照中,其磁盘块需在该快照删除后才会真正释放。在 FAT32 与 exFAT 上,ZIP/7z/tar 的尾部截断正常工作,但 .tar.gz 无法使用文件中部打洞。