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