UTI来自哪里?

cod*_*nd1 8 macos uti

我已经阅读了很多关于UTI的博客文章和SO问题以及OS X如何处理文件类型.但是,仍然有一些我没有得到的东西:

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

  • UTI存储在文件系统级别的哪个位置?我已经知道可以使用mdls命令显示UTI .这是否意味着UTI存储在Spotlight元数据中?如果关闭Spotlight怎么办?

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

Bre*_*don 20

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

系统如何为每个文件创建UTI?

Launch Services维护Mac上所有应用程序(以及某些其他类型的软件包)的数据库以及Info.plist文件中声明的相关信息.它自动更新这些信息 - 我认为它有一个守护进程监视文件系统以监视应用程序的更改,但我不知道详细信息.我知道的是,您可以请求一个名为lsregister为您转储整个数据库的工具.在山狮终端:

$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
Run Code Online (Sandbox Code Playgroud)

各种UTType函数也可以访问这个启动服务数据库(虽然我不确定它们是直接执行还是与某些为它们执行此操作的守护程序进行通信).

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:]-it实际上从文件名中提取路径扩展名,然后调用UTTypeCreatePreferredIdentifierForTag()以获取相关的UTI.(这有点复杂,因为它也在查看路径是否会导致目录或设备文件等,但这是基本想法.)

这是否意味着UTI存储在Spotlight元数据中?如果关闭Spotlight怎么办?

焦点确实保持在它的数据库文件的尿路感染,但是这只是所以它可以快速型搜索和过滤.与Spotlight索引中的其他所有内容一样,此信息不是规范的; 它只是用于快速搜索实际存储在其他地方的数据.如果您关闭Spotlight,那很好 - 没有别的东西取决于它.

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

是的,因为UTI是在运行时根据有关该文件的其他信息计算的.更改文件的UTI与更改其名称的长度同样有意义 - 如果不更改名称本身,则无法执行此操作.