乐于分享
好东西不私藏

给自己写一个压缩软件:12MB、无广告、zip/rar 通吃

给自己写一个压缩软件:12MB、无广告、zip/rar 通吃

你有没有被压缩软件折磨过?

WinRAR 功能确实全,但每次打开都弹「购买授权」的窗口,明明只是想解压一个小文件;7-Zip 干净是干净,界面却停留在上个时代;至于那些「全家桶」压缩软件,装一个进来,桌面多一排图标,右下角多一串弹窗。
我也一样。直到某天我决定:算了,自己写一个。
于是有了 kzhzip——一个只有 12MB 的单文件压缩工具,没有安装包,没有广告,没有弹窗,双击就能跑。

它是什么

kzhzip 是一个 Windows 桌面压缩解压软件,用 Go + Wails 编写,前端是纯粹的 HTML 界面。
整个软件打包成一个 exe,12MB 左右,零依赖、免安装。放到 U 盘里,插到任何 Windows 电脑上就能用;扔进网盘,需要的时候下载下来双击即开,不用装、不用卸载。

能做什么

压缩和解压,一个文件搞定
支持 zip 压缩与解压,同时兼容 rar 解压(RAR4、RAR5、多分卷都行)。rar 因为是闭源格式没法压缩,但解压最常见的场景完全够用。
压缩时可以选择三档级别:最快、标准、最小体积,按需取舍速度和体积。
加密压缩,WinRAR 和 7-Zip 都能解
用 kzhzip 压缩时可以选择 AES-256 加密,生成的文件用 WinRAR、7-Zip 打开也能正常解压,不是闭门造车的私有格式。
解压加密包时,不需要提前在输入框里填密码——打开、解压、双击预览,任何一步遇到加密都会自动弹窗询问密码,输错了会提示重试,一次输入本次会话自动记住。这个体验是我对标主流压缩软件一个个抠出来的。
双击就能预览,不用先解压
这是我最喜欢的功能。压缩包列表里双击任意一个文件,自动解压到临时目录并用系统默认程序打开——双击一个 PDF 直接弹出来看,双击一张图片直接看图,和 WinRAR、7-Zip 的习惯一模一样。
临时文件在下次启动软件时自动清理,不会在硬盘上越堆越多。
右键菜单,自动注册
安装软件最烦的就是各种「右键增强」。kzhzip 的做法是:应用启动时自动检测并注册「用 kzhzip 打开」右键菜单,exe 搬家了也会自动修复路径。
注册写的是当前用户注册表(HKCU),不需要管理员权限,也不改动系统默认的文件关联——你原来默认用哪个软件打开压缩包,还是哪个。
命令行,脚本党的福音
除了图形界面,同一个 exe 还内置完整命令行:
kzhzip l 资料.zip                列出压缩包内容kzhzip x 资料.rar -o D:\out      解压到指定目录kzhzip a 备份.zip D:\工作 -l 9    高压缩比打包
参数顺序随意,支持管道输出,写脚本、做批处理都方便。
一些较真的细节
写这个软件时,我在一些容易翻车的地方下了功夫:
中文文件名:Windows 上老压缩软件生成的 zip 用 GBK 编码存文件名,直接读会乱码。kzhzip 自动检测编码并修复,打开国内下载的压缩包,文件名不会变成一堆「锟斤拷」。
安全:压缩包是常见的攻击入口,kzhzip 对每个条目做路径校验,拒绝「Zip Slip」类型的路径穿越攻击——带绝对路径、盘符或 .. 的恶意条目一律不落地。
单实例:重复双击多个压缩包,不会开一堆窗口,复用一个窗口逐个打开。
拖放打开:把 zip/rar 直接拖进窗口就能打开。
为什么要自己写
我自己要的压缩工具,标准很简单:打开快、界面干净、该有的功能一个不少、不该有的一个都不要。与其在别人家软件里反复权衡取舍,不如按自己的标准做一个。

适合谁用

被广告弹窗和捆绑安装烦到的普通用户
喜欢「一个 exe 走天下」的便携党
需要在脚本或命令行里处理压缩包的技术同学
对压缩包安全性有要求的谨慎用户
如果你也受够了压缩软件的广告和捆绑,不妨试试这种「小而干净」的路线。工具是给人用的,不该反过来折腾人。
kzhzip:Go + Wails 编写的 Windows 压缩解压工具,单文件 12MB,支持 zip 压缩解压、rar 解压、AES-256 加密、双击预览、右键菜单与命令行。

目录结构

├── main.go            入口:命令行分发 + Wails 启动配置(窗口、拖放、单实例锁)├── cli.go             # 命令行实现(l/x/a/reg/unreg/app、控制台附着、进度条)├── contextmenu.go     # 右键菜单注册/注销(HKCU 注册表)├── app.go             # 前端可调用方法(对话框、压缩/解压编排、进度事件、单实例转交)├── archive_zip.go     # zip 压缩/解压实现├── archive_rar.go     # rar 解压实现(rardecode)├── common.go          # 共享类型、GBK 文件名解码、路径安全├── archive_test.go    # 压缩/解压自动化测试(含本机 Rar.exe 构造的真实样本)├── cli_test.go        # 命令行 + 右键菜单注册自动化测试├── third_party/zip/   # yeka/zip 本地 fork:增加 SetDeflateLevel 级别设置└── frontend/          # 纯静态前端(无 npm 依赖)    ├── index.html    ├── app.js    └── style.css
注意:项目根目录若出现 kzhzip.exe 是 go build ./... 检查编译时产生的无标签半成品,无法运行(会提示 build tags 错误),以 build\bin\kzhzip.exe 为准。

构建与测试

环境:Go 在 D:\golang\bin,Wails CLI 在 D:\go\bin$env:Path = "D:\golang\bin;D:\go\bin;" + $env:Pathwails build          # 产出 build/bin/kzhzip.exe(必须用 wails build,不能直接 go build)go test ./...        # 跑自动化测试(rar 用例需本机 WinRAR 的 Rar.exe)wails dev            # 开发模式热重载
注意:项目根目录若出现 kzhzip.exe 是 go build ./... 检查编译时产生的无标签半成品,无法运行(会提示 build tags 错误),以 build\bin\kzhzip.exe 为准。

技术说明

双模式单 exe:GUI 子系统程序默认无控制台,命令行模式运行时通过 AttachConsole 附着调用方控制台(cmd/PowerShell 中能看到输出),GUI 模式不受影响
参数预扫描:Go flag 包遇到第一个非 flag 参数即停止解析,工具内置 splitArgs 把选项重排到前面,任意顺序写法都能解析
中文文件名:Windows 中文压缩软件生成的 zip 为 GBK 编码,读取时自动检测并转 UTF-8;rar 由 rardecode 内置解码,异常时按 GBK 兜底修复
加密标记:zip 可提前探测条目是否加密;rar 是流式格式,读取到加密数据时才提示输入密码
压缩级别:本地 fork 为 yeka/zip 增加了 SetDeflateLevel(上游写死 level 5),见 third_party/zip/register.go
双击预览:单条目解压到 %TEMP%\kzhzip\<包路径哈希>\,按包隔离防同名覆盖,交给 explorer 用系统默认程序打开;临时文件下次启动统一清理
单实例锁:Wails SingleInstanceLock,第二个实例携带的文件路径会转交给已运行窗口打开后自动退出
右键菜单自愈:启动时校验注册表 command 是否指向当前 exe 路径(isContextMenuRegistered),失效即重写——exe 搬家后无需重新 reg;注册动作异步执行,失败静默不阻塞启动。