9

我已经阅读了很多关于统一类型标识符以及 OS X 如何处理文件类型的博客文章和 SO-questions。但是,仍然有一些我没有得到的东西:

  • 系统如何为每个文件创建 UTI?作为开发人员,我被动地为我的文件类型声明一个 UTI,但系统负责为每个匹配的文件分配 UTI。我目前的印象是 UTI 是 Finder 根据文件扩展名即时创建的。

  • UTI 在文件系统级别存储在哪里?我了解到可以使用mdls命令显示 UTI。这是否意味着 UTI 与 Spotlight 元数据一起存储?如果 Spotlight 关闭了怎么办?

  • 没有 API 可以手动添加或更改特定文件的 UTI 是否正确?

4

1 回答 1

25

它实际上并没有那么大的魔力。你问了几个不同的问题,所以我会试着给你每个答案:

系统如何为每个文件创建 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 与更改其名称的长度一样有意义 - 如果不更改名称本身,您将无法做到这一点。

于 2013-08-02T10:39:12.437 回答