普通解压器先把文件全部解出来,压缩包留在原地,等用户确认没问题再手动删除。最坏的那一瞬间,磁盘上同时躺着压缩包和解出的文件:180 GB 的包解出 200 GB,那一刻要 380 GB。HatchZip 把顺序倒过来,写出一批文件就把压缩包里对应的字节截掉,压缩包一路变短,峰值占用接近输出本身。项目用 Rust 写成,Apache-2.0 许可,桌面窗口与命令行是同一样东西。
两倍空间的峰值
作者在一张 220 MiB 的盘上做了对照,盘里只剩五十来兆,同一份 200 MB 游戏数据(21 个文件)分别由真实工具打包。unzip 解到第 6 个文件就报空间不足。GNU tar 的 200 MB 包在常规工具手里要 400 MB,这里 0.12 秒解完,逐字节一致。7-Zip 25.01 的十个 20 MB 实心块同样过线,0.64 秒,常规工具需要 380 MB。拆成五个 40 MB 分卷的 7z 也没卡住,峰值占用 210 MB。速度上同样一份数据的 ZIP,解压 0.25 到 0.35 秒,unzip 6.00 要 1.48 到 1.50 秒。
![]()
能不能装下由 check 子命令回答,只读索引和剩余空间,不动任何文件。给出的三行是可用空间、保留压缩包所需的量、原地解压所需的量,最后一行是结果还剩多少。差得不多时,输出会直接说明差在哪儿。
边写边删的机制
ZIP 的一个条目、7z 的一个实心块、tar 的一条记录都能单独解码,被称作 unit。ZIP 与 7z 把索引放在文件末尾,而截断只能从后往前,所以先把索引抄到压缩包旁边的 .hatchzip-tail 并记下 CRC-32,之后从最后一个 unit 往前解。
每一批走五步:解到 .hatchzip-part、把这一批落盘、写进度文件记下已提交的长度、把压缩包截到本批最低 unit 的起点。进度文件 .hatchzip 里存着格式与各分卷的原始长度,还有尾部位置、输出目录与已提交长度,中断之后接着做不必猜测格式。截断用的是各系统都自带的缩短文件,不必动文件开头。分卷包按一个逻辑文件处理,整卷解完就删,跨卷的条目等最后一段出来;RAR 的每一卷本身是完整的 RAR 文件,按文件释放;.tar.gz 只能从前往后解码,改成边解边在压缩流上打洞,每 256 MiB 留一个可恢复点。
![]()
省不掉的情形
实心 7z 只有一个块时,整块解完才谈得上释放,而 7-Zip 的默认设置正是一整块,这类包在动手前就被拒绝,并说明需要多少空闲空间。加 --keep-archive 想要保留压缩包时按普通解压走,需要的空间是全部输出。输出目录与压缩包不在同一块盘,释放压缩包也帮不到输出那一侧。.tar.zst 与 .tar.xz 目前直接拒绝,加密条目暂不支持,实心 RAR 只能保留压缩包再解。FAT32 与 exFAT 上的 .tar.gz 仍然可解可续,但要留出压缩包加全部文件的空间。btrfs 或 APFS 上被快照盖住的压缩包空间,要等快照删掉才回来。
中断与还原
两条规则撑住断电安全:进度文件不会声明还没落盘的文件,压缩包也不会被截到进度文件之前。任何一步断掉,要么文件已经在盘上,要么字节还在压缩包里,不会两头落空。继续时先删掉没提交的半成品,重做那一批。
想彻底收手就用 restore,剩下的压缩包正好是还没解出的部分,补写一段索引就能被常规工具打开,已经解出的文件留在输出目录。拿不准下载是否完整时加 --verify-first,先核对每个文件的校验和再动手。目录里已有同名文件时默认拒绝,--replace 会把旧文件先挪进 .hatchzip-replaced,全部解完再按选择删掉或放回,--skip-existing 则保留原有的那一份。--keep-free 默认留 2 GB 不碰,避免把盘写满到零。
![]()
安装这一步,Windows 的 setup 是逐用户安装,不需要管理员权限,会加右键菜单;便携版解压即用;macOS 有 dmg,Linux 有 deb 与 rpm,也有免安装的 AppImage,Homebrew 与 Scoop 都能装。命令行与桌面版共用同一个引擎,短名 hz。项目说明里写明代码签名还没买,Windows 上要在提示里点更多信息再点仍要运行,macOS 15 之后要在系统设置里放行。
更多游戏资讯请关注:电玩帮游戏资讯专区
电玩帮图文攻略 www.vgover.com
