我已经阅读了很多关于UTI的博客帖子和SO问题以及OS X如何处理文件类型。但是,仍然有一些我不明白的事情:
系统如何为每个文件创建UTI?作为开发人员,我被动地为我的文件类型声明了一个UTI,但系统负责为每个匹配的文件分配UTI。 我目前的印象是,Finder根据文件扩展名即时创建UTI。
UTI存储在文件系统级别的哪个位置?我了解到可以使用mdls
命令显示UTI。这是否意味着UTI存储在Spotlight元数据中?如果关闭Spotlight怎么办?
没有API可以手动添加或更改特定文件的UTI吗?
答案 0 :(得分:19)
实际上并没有太大的魔力。你问了几个不同的问题,所以我会试着给你每个答案:
系统如何为每个文件创建UTI?
Launch Services维护Mac上所有应用程序(以及某些其他类型的软件包)的数据库以及Info.plist文件中声明的相关信息。它自动更新这些信息 - 我认为它有一个守护进程监视文件系统以监视应用程序的更改,但我不知道详细信息。我做知道的是,你可以要求一个名为lsregister
的工具为你转储整个数据库。在山狮终端:
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
各种UTType
函数也可以访问此Launch Services数据库(虽然我不确定它们是直接执行还是与某些为其执行此操作的守护程序进行通信)。
UTI存储在文件系统级别的哪个位置?
嗯,实际的Launch Services数据库似乎位于每台Mac上不同的位置。在我的看来,它似乎在/private/var/folders/mf/1xd7vlw90dj5p4z1r5f800bc000101/C/com.apple.LaunchServices-0371025.csstore
。 (至少,lsregister
在文件工作时保持打开;我实际上并不确定它是什么,但我认为它是数据库。)
这只是声明的UTI列表。没有UTI字段附加到给定文件。当您向Cocoa请求文件的UTI-through时,例如-[NSWorkspace typeOfFile:error:]
或-[NSURL getResourceValue:forKey:error:]
- 它实际上从文件名中提取路径扩展名,然后调用UTTypeCreatePreferredIdentifierForTag()
来获取相关的UTI。 (它有点复杂,因为它也会查看路径是否会导致目录或设备文件等,但这是基本想法。)
这是否意味着UTI存储在Spotlight元数据中?如果关闭Spotlight会怎样?
Spotlight 将文件的UTI保留在其数据库中,但这样才能快速按类型搜索和过滤。与Spotlight索引中的其他所有内容一样,此信息不是规范的;它只是用于快速搜索实际存储在其他地方的数据。如果您关闭Spotlight,那很好 - 没有别的东西取决于它。
没有API可以手动添加或更改特定文件的UTI吗?
是的,因为UTI是在运行时根据有关该文件的其他信息计算的。更改文件的UTI与更改其名称的长度同样有意义 - 如果不更改名称本身,则无法执行此操作。