Skip to main content

Cgo

在 Go 里用 libarchive 写一个接近 bsdtar 的归档器

·649 words·4 mins
这篇只是记一下最近用 Go 包 libarchive 的思路。 目标很普通:把一个目录打成 tar.zst,解包时也尽量保留原来的文件系统语义。真正费时间的地方不在遍历目录,而是各种边角:非 ASCII 文件名、软链接、硬链接、稀疏文件、设备节点、权限、owner、xattr,还有一些错误只会在 close 阶段冒出来。 如果只用 Go 标准库 archive/tar 手写,普通文件当然很快能跑通,但后面大概率会变成不断补特例。所以我最后还是把 libarchive 当成底层实现,行为尽量贴近 bsdtar。