使用 HFS+ 命名分叉的 API 是什么?

What are the APIs for working with HFS+ named forks?

我知道资源分支在 Mac OS X 中已弃用。

尚不清楚不太知名且很少使用的命名分叉是否也已弃用。 HFS+ 实际上支持对任何文件进行任意数量的任意长度的分叉。 (Mac 的命名分叉在概念上类似于 Windows 的备用数据流或 "ADS"。)

无论是否弃用,仍有理由学习创建、枚举、删除和其他操作文件分叉。

然而我似乎找不到任何关于使用分叉的 API 的信息。

我所能找到的是,从终端和可能接受文件名或路径的其他地方,您可以使用语法 <filename>/..namedfork/rsrc 访问资源分支,直到最近还有 <filename>/rsrc。我尝试用其他名称替换 rsrc 但我在终端中尝试的所有命令都失败了。

我在哪里可以找到有关 API 的旧文档或非官方文档,以便以编程方式在 OS X 中使用命名分叉?

顺便说一下,在谷歌搜索这个话题时,互联网上似乎存在一个普遍的误解。随机投注者说命名分叉是建立在命名文件属性之上的。事实并非如此。命名文件属性是一个相当新的 OS X 特性。命名分叉早于 OS X。似乎命名文件属性实际上很可能在幕后使用命名分叉。

无论如何,请不要提交有关命名文件属性的答案。我正在专门寻找有关任意命名叉子的信息。


有一些命名分叉的描述in section 12.7.4. "The Attributes File"

在这上面花了好几个小时后,我相信我可以放心地得出这个结论:

  • HFS+ 支持任意命名的文件分叉。
  • 然而,
  • Mac API 从未包含 public API 以与除数据分叉和资源分叉之外的任何其他分叉一起工作。

抱歉,我没有具体的链接来支持我的发现。我基本上是通过查看 apple.com 和许多其他不同页面上的许多页面来构建图片的。

但特别是大多数与分叉相关的 API 都是成对存在的,其中一个用于数据分叉,另一个用于资源分叉。当 API 使用或 return 有关分叉的数据时,它是用一个只能有两个合法值的数字字段完成的,而不能是表示分叉名称的任意字符串。

旧的文件管理器可以做到这一点。不幸的是,这些文档似乎甚至不在 Apple 的 Retired Documents Library.

因此,您必须查看 headers,它们有很好的文档记录。参见 /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/Files.h。在那里,您会发现,例如,FSOpenFork(),它采用任意分支名称。但是请注意,记录它的评论说,"All volumes should support data and resource forks. Other named forks may be supported by some volumes."(强调我的。)

一旦您从 FSOpenFork() 获得了分叉参考编号,您就可以使用 FSReadFork() 从中读取,等等

我的旧答案错了!三年后,现在互联网上有更多信息,包括旧的和已弃用的 Apple 开发人员文档的镜像。

以下是我发现的命名分叉的 API 精选:

打开文件

  • FSOpenFork 打开文件或目录的任何分支以进行流式访问。
  • PBOpenForkSync 打开文件或目录的任何分支以进行流式访问。
  • PBOpenForkAsync 打开文件或目录的任何分支以进行流式访问。

创建和删除命名分叉

  • FSCreateFork 为文件或目录创建命名派生。
  • PBCreateForkSync 为文件或目录创建命名派生。
  • PBCreateForkAsync 为文件或目录创建命名派生。
  • FSDeleteFork 从文件或目录中删除命名的分支。
  • PBDeleteForkSync 从文件或目录中删除命名的分支。
  • PBDeleteForkAsync 删除文件或目录的命名分支

迭代命名叉

  • FSIterateForks 确定属于文件或目录的每个命名分支的名称和大小。
  • PBIterateForksSync 确定属于文件或目录的每个命名分支的名称和大小。
  • PBIterateForksAsync 确定属于文件或目录的每个命名分支的名称和大小

操纵文件和分叉大小

  • FSGetForkSize Returns 一个叉子的大小。
  • PBGetForkSizeSync Returns 一个叉子的大小。
  • PBGetForkSizeAsync Returns 一个叉子的大小。
  • FSSetForkSize 更改打开叉子的大小。
  • PBSetForkSizeSync 更改打开叉子的大小。
  • PBSetForkSizeAsync 更改打开叉子的大小。

Core Services Framework Reference