我不是这方面的专家,但是我已经阅读了一些尝试以了解发生了什么。
我会说:“混乱源于以下事实:
- 这些概念之间的关系很复杂,
- 随着时间的推移而改变,
- 苹果公司已经实现了程序级别的API和诸如ls或cp之类的工具,从而隐藏了概念之间的许多差异。”
AIUI,HFS +目录文件包含目录文件记录(以及其他内容)。目录文件记录包含有关文件的常规信息,例如创建日期,访问日期等。目录文件记录还包含两个结构,这些结构提供有关数据分支和资源分支的位置和大小的信息。
AIUI,HFS +还具有(从Wikipedia HFS +复制而来的)“属性文件[它是HFS Plus中的新B树,在HFS中没有相应的结构。属性文件可以存储3种不同类型的4 KB记录:内联数据属性记录,Fork数据属性记录和扩展属性记录。内联数据属性记录存储可以容纳在记录本身内的小属性。ForkData Attribute记录最多包含八个扩展区的引用,这些扩展区可以容纳较大的属性。当已经使用了它的八个扩展区记录时,用于扩展Fork Data Attribute记录。”
AIUI,存储在属性文件中(或从中引用)的数据(无论是内联,分叉数据还是扩展属性)被称为扩展属性。
这些是数据结构,那么如何使用它们呢?
AIUI是操作系统的早期版本(可能是10.4 Tiger之前的版本,John Siracusa似乎表示在此方面进行了一些重大更改),它指向目录文件中的数据分支和资源分支。
AIUI,一旦我们到达10.4 Tiger,属性文件将被广泛用于存储各种数据。
可能(但我不知道)在10.4及之后的版本中,从属性文件中指向任何资源叉。即在回答您的第一个问题时,我想说命名叉是扩展属性,除非它们是资源叉,并且资源叉是从目录文件中引用的。
知道如何实现事物的问题是,为了保持向后兼容性,并且可能尤其是为了支持从一个版本的Mac OS到另一个版本对由一个版本的Mac OS编写的文件系统的访问,需要透明地支持不同的事物和事物的混合。
我们无法从普通的Terminal命令行工具中得知实际保存数据的位置。
因此,访问rsrc
可能表明正在访问目录文件中的资源叉。
$ ls -l Icon^M/rsrc
-rwxr-xr-x 1 root admin 486 23 Jul 2004 Icon?/rsrc
但是,我们知道尽管语法看起来像Icon^M
正在访问目录下的文件,但实际上并非如此,因为
$ ls -lR Icon^M
-rwxr-xr-x@ 1 root admin 0 23 Jul 2004 Icon?
因此,苹果为资源叉实施了特殊情况。
如果相反,我们会
$ ls -l@
-rwxr-xr-x@ 1 root admin 0 23 Jul 2004 Icon?
com.apple.FinderInfo 32
com.apple.ResourceFork 486
这表明我们正在访问属性文件。但是同样,ls
资源叉的实现可能会有特殊情况。
John Siracusa在此指出,ACL列表存储为“扩展属性”,但被专门屏蔽掉,因此未在中显示xattr
。因此,在xattr的实现中再次有特殊情况处理。
(请注意,这种特殊情况的处理可以在工具的代码中,或者在工具访问的基础API的代码中。)
GregW,如果您看到了这一点,那么就我是否是正确的路线,或者只是毫无希望地感到困惑,获得更专业的意见将是一件很好的事情。