它实际上并没有那么大的魔力。你问了几个不同的问题,所以我会试着给你每个答案:
系统如何为每个文件创建 UTI?
Launch Services 维护 Mac 上所有应用程序(以及某些其他类型的捆绑包)的数据库以及在其 Info.plist 文件中声明的相关信息。它会自动更新这些信息——我认为它有一个监视文件系统的守护程序来监视应用程序的更改,但我不知道详细信息。我所知道的是,您可以要求一个名为lsregister
为您转储整个数据库的工具。在山狮码头:
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
各种UTType
功能也访问此启动服务数据库(尽管我不确定它们是直接执行,还是与为它们执行此操作的某种守护进程通信)。
UTI 在文件系统级别存储在哪里?
好吧,实际的 Launch Services 数据库似乎位于每台 Mac 上不同的位置。在我的,它似乎在/private/var/folders/mf/1xd7vlw90dj5p4z1r5f800bc000101/C/com.apple.LaunchServices-0371025.csstore
. (至少,lsregister
在它工作的时候保持这个文件打开;我实际上不确定它里面有什么,但我认为它是数据库。)
不过,这只是已声明的尿路感染列表。给定文件没有附加 UTI 字段。当您向 Cocoa 询问文件的 UTI 时(例如,通过-[NSWorkspace typeOfFile:error:]
或),-[NSURL getResourceValue:forKey:error:]
它实际上会从文件名中提取路径扩展名,然后调用UTTypeCreatePreferredIdentifierForTag()
以获取相关的 UTI。(它比这更复杂一点,因为它还查看路径是否指向目录或设备文件或其他内容,但这是基本思想。)
这是否意味着 UTI 与 Spotlight 元数据一起存储?如果 Spotlight 关闭了怎么办?
Spotlight确实在其数据库中保留了文件的 UTI,但这只是为了快速搜索和按类型过滤。与 Spotlight 索引中的其他所有内容一样,此信息不是规范的;它只是用于快速搜索实际存储在其他地方的数据。如果您关闭 Spotlight,那很好 - 没有其他依赖于它。
没有 API 可以手动添加或更改特定文件的 UTI 是否正确?
是的,因为 UTI 是在运行时根据文件的其他信息计算得出的。更改文件的 UTI 与更改其名称的长度一样有意义 - 如果不更改名称本身,您将无法做到这一点。