1

Apple 的新文件系统 APFS 带来了测试文件名相等性的新规则,它们与 HFS 不同。我正在寻找正确的方法来比较两个名称是否相等,特别是对于 APFS,但为了完整性,添加一个用于 HFS+ 检查也没有什么坏处。

为什么?因为我需要能够判断我在目录中找到的文件名是否与某个模式匹配,例如包含某个子字符串。为此,我需要匹配文件系统和 Finder 用于比较名称的确切规则。

对于这些文件系统的区分大小写的变体,这很容易,因为按字节比较就足够了,我相信(假设两个字符串都使用相同的编码)。

对于不区分大小写的 HFS+,我认为甚至还有一个特殊的比较选项,但我在 NSStringCompareOptions 中找不到这样的选项。我认为这是必要的,因为 HFS+ 使用的是旧版本的 Unicode 标准。我引用了 TN1150(很遗憾,它似乎不再在 Apple 网站上提供):

Unicode 细微之处

HFS Plus 大量使用 Unicode 字符串来存储文件和文件夹名称。然而,Unicode 仍在不断发展,它在文件系统中的使用带来了许多挑战。本节描述了一些挑战,以及 HFS Plus 使用的解决方案。

重要提示:实现不得使用其本机平台实现的 Unicode 实用程序(用于分解和比较),除非这些算法等同于此处定义的 HFS Plus 算法,并且保证永远如此。这种情况很少见。平台算法倾向于随着 Unicode 标准而发展。HFS Plus 算法不能进化,因为这样的进化会使现有的 HFS Plus 卷失效

啊,我想到了关于获得所用编码的 HFS+ 版本的部分:

注意:Mac OS 文本编码转换器提供了几个常量,可让您与存储在 HFS Plus 卷上的规范、分解形式相互转换。使用 CreateTextEncoding 创建文本编码时,应将 TextEncodingBase 设置为 kTextEncodingUnicodeV2_0,将 TextEncodingVariant 设置为 kUnicodeCanonicalDecompVariant,并将 TextEncodingFormat 设置为 kUnicode16BitFormat。使用这些值可确保 Unicode 与 HFS Plus 卷上的格式相同,即使随着 Unicode 标准的发展。

那么,正确比较 HFS+ 和 APFS 名称的现代方法是什么?

4

1 回答 1

1

我通过读取原始数据比较了两个文件系统。在 HFS plus 目录文件和文件属性中,文件名 Test.jpg 存储为 0x0054006500730074002E006A00700067

在 Apple 文件系统中,我们有 4kb 块。Blocktype 0x0300 BlockID 0x07040000 00000000 与目录文件相当。Blocktype 0x0300 BlockID 0x11040000 00000000 是苹果查找器信息,包括文件大小、磁盘大小和指向文件所在块的小端序指针。文件名 Test.jpg 存储为 0x546573742E6A7067。我从来没有在我的 iMac 上使用过除 Ascii 0-127 以外的字符的文件名,经过尝试,结果证明可以在 APFS 和 HFS plus 的文件名中使用扩展的 ascii、unicode 和笑脸。

APFS 是无证的,我们所知道的都是从逆向工程中学到的。

有关APFS 的其他信息,请参阅Cugu 的博客

于 2017-10-07T00:38:55.823 回答