从经典 Mac 别名记录生成书签文件

Generate a Bookmark file from a classic Mac Alias record

对于一个已经存在很多年并且在文件中存储经典别名记录的应用程序,我现在喜欢重新创建指向同一个文件的别名文件,而不必先解析别名(因为目的地可能在那一刻不可用)。

据说这应该可以做到这一点:

CFDataRef aliasRecord = ... ; // contains the Alias Record data, see below for an example
CFURLRef url = ... ; // initialized with a file URL
CFDataRef bmData = CFURLCreateBookmarkDataFromAliasRecord (NULL, aliasRecord);
CFError error;
bool ok = CFURLWriteBookmarkDataToFile (bmData, url, 0, &error);

但是写函数失败,报错"The file couldn’t be saved."

如果我改为使用 CreateBookmarkData 创建书签数据,写入成功。

如何进行这项工作?如果不是完全弃用的话,我会尝试用资源分支中的数据编写一个旧式别名文件。

这是我在 aliasRecord 对象中的别名记录示例 - 我可以使用经典的别名管理器 FSResolveAlias 函数解决这个问题,所以我知道它确实有效。

00 00 00 00 01 12 00 02 00 01 06 54 54 73 4D 42
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 CC 31 2F 12 48 2B 00 00 01 A5
F3 9B 03 74 6D 70 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 AC 1C 67 D1 FE B7 D0 00 00 00 00 00 00
00 00 FF FF FF FF 00 00 09 20 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 07 70 72 69 76 61 74
65 00 00 10 00 08 00 00 CC 31 12 F2 00 00 00 11
00 08 00 00 D1 FE 9B B0 00 00 00 01 00 04 01 A5
F3 9B 00 02 00 13 54 54 73 4D 42 50 3A 70 72 69
76 61 74 65 3A 00 74 6D 70 00 00 0E 00 08 00 03
00 74 00 6D 00 70 00 0F 00 0E 00 06 00 54 00 54
00 73 00 4D 00 42 00 50 00 12 00 0B 70 72 69 76
61 74 65 2F 74 6D 70 00 00 13 00 01 2F 00 FF FF
00 00

CFURLCreateBookmarkDataFromAliasRecord() 不使用 CFURLWriteBookmarkDataToFile() 所需的 kCFURLBookmarkCreationSuitableForBookmarkFile 选项创建书签数据。

CFURLCreateBookmarkDataFromAliasRecord() 旨在作为一种将存储程序自己的数据文件的别名记录转换为没有 I/O.

的书签的方法

CFURLWriteBookmarkDataToFile() 之前,Finder 别名文件(书签文件)是由 Finder 创建的。这些文件包含别名资源(包含可以使用 FSCopyAliasInfo() 从别名资源获取的已知属性)和图标资源。 Apple 需要 CFURLWriteBookmarkDataToFile() 编写的文件中的书签数据来提供相同的属性。 kCFURLBookmarkCreationSuitableForBookmarkFile 选项强制执行该要求。

如果您有 AliasHandle 并且想要创建带有书签数据的新型 Alias 文件,您需要:

(1) 将 AliasHandle 解析为 FSRef,从 FSRef 创建 CFURLRef,然后使用 [=11= 创建书签数据]选项,

(2) 您需要解析使用CFURLCreateBookmarkDataFromAliasRecord()创建的书签数据,然后使用kCFURLBookmarkCreationSuitableForBookmarkFile选项创建新的书签数据。

但是,您已表示希望在不解析 AliasHandle 的情况下处理此问题,因此唯一的解决方案是创建一个旧式的 Finder Alias 文件。尽管我知道您已经知道如何完成该操作,但在 How do I create a Finder alias within an application?.

中对其进行了描述

用户第一次使用 Finder resolves/opens 旧式 Alias 文件时,Finder 会检测到需要更新的 Alias 文件(即 CFURLCreateByResolvingBookmarkData() 将 return使用 isStale == true),Finder 将为别名文件的目标创建一个新书签并重新写入别名文件。 CFURLCreateBookmarkDataFromFile() 将尽可能长时间地继续支持旧式 Alias 文件以实现向后兼容性。