2

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

我想达到的效果ditto --hfsCompression src dst,但没有炮轰。

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

4

3 回答 3

2

copyfile.c文件披露了一些实施细节。

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

于 2018-03-21T12:15:55.623 回答
2

afsctool是 HFS+ 压缩的开源实现它最初是由黑客brkirch(macrumors 论坛链接,因为他仍然访问那里),但后来被@rjvb扩展和改进了很多,他正在用它做惊人的事情。

于 2018-03-21T13:28:04.137 回答
1

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

如果您问“如何将任意文件 'A' 制作为 HFS 压缩文件?” 答案是,你可以,不能。HFS 压缩文件由安装程序创建,并且(技术上[1])只有 Apple 可以创建它们。

如果您问“如何模拟--hfsCompression逻辑,ditto以便将 HFS 压缩文件从一个 HFS+ 卷复制到另一个 HFS+ 卷并保留其压缩?” 答案很简单,尽管没有很好的记录。

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

要恢复压缩文件,您需要颠倒过程:写入一个空文件,然后恢复其所有扩展属性,特别是特殊属性。完成后,设置文件的UF_COMPRESSED标志,未压缩的数据将神奇地出现在其数据叉中。

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

于 2018-03-19T17:16:28.140 回答