首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTI从何而来?

UTI从何而来?
EN

Stack Overflow用户
提问于 2013-06-05 15:24:35
回答 1查看 2.4K关注 0票数 9

我读过很多博客文章,以及关于统一类型标识符和OS如何处理文件类型的问题。然而,有些事情我还是不明白:

  • 系统如何为每个文件创建UTIs?作为开发人员,我被动地为我的文件类型声明了一个UTI,但是系统负责为每个匹配的文件分配UTI。我目前的印象是,UTI是由Finder根据文件扩展名动态创建的。
  • UTIs存储在文件系统级别的哪里?我了解到可以使用mdls命令显示UTI。这是否意味着UTI是沿Spotlight元数据存储的?如果聚光灯被关掉了呢?
  • 没有API手动添加或更改特定文件的UTI是正确的吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-02 10:39:12

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

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

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

代码语言:javascript
复制
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump

各种UTType函数也访问这个Launch数据库(虽然我不确定它们是直接这样做的,还是与为它们做这件事的某种守护进程通信)。

文件系统级别上的UTI存储在哪里?

嗯,实际的Launch数据库似乎位于每个Mac上不同的位置。在我身上,它似乎是在/private/var/folders/mf/1xd7vlw90dj5p4z1r5f800bc000101/C/com.apple.LaunchServices-0371025.csstore。(至少,lsregister在文件工作时保持打开状态;我不确定其中包含什么内容,但我假设它是数据库。)

不过,这只是声明的UTI的列表。没有UTI字段附加到给定的文件。当您向Cocoa请求文件的UTI时,例如,-[NSWorkspace typeOfFile:error:]-[NSURL getResourceValue:forKey:error:]-it实际上从文件名中提取路径扩展名,然后调用UTTypeCreatePreferredIdentifierForTag()来获取相关的UTI。(它比这要复杂一些,因为它还在查看路径是否指向目录或设备文件,但这是基本的想法。)

是否意味着UTI存储在Spotlight元数据上?如果关闭聚光灯怎么办?

聚光灯确实将文件的UTI保存在数据库中,但这只是为了让它能够快速地按类型进行搜索和筛选。与Spotlight索引中的其他所有内容一样,该信息不是规范的;它只是用于快速搜索实际存储在其他地方的数据。如果你关掉聚光灯,那就好了

没有为特定文件手动添加或更改UTI的API正确吗?

是的,因为UTI是在运行时根据有关文件的其他信息计算的。更改文件的UTI与更改文件名的长度一样有意义--如果不更改文件名本身,就无法做到这一点。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16943819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档