macOS HFS+ 支持透明的文件系统级压缩。如何通过编程 API 为某些文件启用此压缩?(例如 Cocoa 或 C 接口)
我想达到的效果ditto --hfsCompression src dst
,但没有炮轰。
澄清一下:我在问如何压缩未压缩的文件。我对阅读或保留现有的 HFS 压缩状态不感兴趣。
macOS HFS+ 支持透明的文件系统级压缩。如何通过编程 API 为某些文件启用此压缩?(例如 Cocoa 或 C 接口)
我想达到的效果ditto --hfsCompression src dst
,但没有炮轰。
澄清一下:我在问如何压缩未压缩的文件。我对阅读或保留现有的 HFS 压缩状态不感兴趣。
该copyfile.c
文件披露了一些实施细节。
还有一个基于此的压缩工具:afsctool
.
我认为您在问两个不同的问题(并且可能不知道)。
如果您问“如何将任意文件 'A' 制作为 HFS 压缩文件?” 答案是,你可以,不能。HFS 压缩文件由安装程序创建,并且(技术上[1])只有 Apple 可以创建它们。
如果您问“如何模拟--hfsCompression
逻辑,ditto
以便将 HFS 压缩文件从一个 HFS+ 卷复制到另一个 HFS+ 卷并保留其压缩?” 答案很简单,尽管没有很好的记录。
HFS 压缩文件有一个特殊的UF_COMPRESSED
文件标志。如果您看到,文件的数据分支实际上是隐藏资源的未压缩图像。文件的压缩版本存储在一个特殊的扩展属性中。它很特别,因为当您请求它们时,它通常不会出现在属性列表中(因此ls -l@
,例如,如果您只是文件,您将看不到它)。要列出和读取这个特殊属性,您必须将XATTR_SHOWCOMPRESSION
标志传递给listxattr()
andgetxattr()
函数。
要恢复压缩文件,您需要颠倒过程:写入一个空文件,然后恢复其所有扩展属性,特别是特殊属性。完成后,设置文件的UF_COMPRESSED
标志,未压缩的数据将神奇地出现在其数据叉中。
[1] 注意:据传文件的压缩资源只是数据的压缩版本,可能带有一些包装器。我从未花时间进行实验,但如果您打算创建自己的压缩文件,则可以尝试对压缩扩展属性进行逆向工程。