如何以编程方式压缩 HFS 上的文件?

How to compress file on HFS programmatically?

macOS HFS+ 支持透明的文件系统级压缩。如何通过编程 API 为某些文件启用此压缩? (例如 Cocoa 或 C 接口)

我想达到ditto --hfsCompression src dst的效果,但又不想掏空。

澄清一下:我问的是如何压缩未压缩的文件。我对读取或保留现有的 HFS 压缩状态不感兴趣。

我认为您在问两个不同的问题(并且可能不知道)。

如果你问 "How can I make arbitrary file 'A' an HFS compressed file?" 答案是,你可以,'。 HFS 压缩文件由安装程序创建,(技术上 [1])只有 Apple 可以创建它们。

如果您问 "How can I emulate the --hfsCompression logic in ditto such that I can copy an HFS compressed file from one HFS+ volume to another HFS+ volume and preserve its compression?" 答案很简单,尽管没有很好的记录。

HFS 压缩文件有一个特殊的 UF_COMPRESSED 文件标志。如果您看到,文件的数据分支实际上是隐藏资源的未压缩图像。文件的压缩版本存储在一个特殊的扩展属性中。它很特别,因为当您请求它们时,它通常不会出现在属性列表中(因此,例如,如果您只是 ls -l@ 文件,您将看不到它)。要列出和读取此特殊属性,您必须将 XATTR_SHOWCOMPRESSION 标志传递给 listxattr()getxattr() 函数。

要恢复压缩文件,您可以逆向执行该过程:写入一个空文件,然后恢复其所有扩展属性,特别是特殊属性。完成后,设置文件的 UF_COMPRESSED 标志,未压缩的数据将神奇地出现在其数据分支中。

[1] 注意:有传言说文件的压缩资源只是数据的 ZIP 版本,可能带有一些包装器。我从未花时间进行实验,但如果您打算创建自己的压缩文件,您可以尝试 reverse-engineering 压缩扩展属性。

copyfile.c 文件公开了一些实施细节。

还有一个基于此的压缩工具:afsctool

afsctool which is an open source implementation of HFS+ compression. It was originally by hacker brkirch (macrumors forum link, as he still visits there) but has since been expanded and improved a great deal by @rjvb人正在用它做一些了不起的事情。