我读过很多博客文章,以及关于统一类型标识符和OS如何处理文件类型的问题。然而,有些事情我还是不明白:
mdls命令显示UTI。这是否意味着UTI是沿Spotlight元数据存储的?如果聚光灯被关掉了呢?发布于 2013-08-02 10:39:12
其实没有那么大的魔力。你问了几个不同的问题,所以我试着给出每个问题的答案:
系统如何为每个文件创建UTIs?
Launch在Mac上维护所有应用程序(和某些其他类型的包)的数据库,以及在它们的Info.plist文件中声明的相关信息。它会自动更新这些信息--我认为它有一个守护进程监视文件系统以监视应用程序的更改,但我不知道细节。我所知道的是,您可以要求一个名为lsregister的工具为您转储整个数据库。在狮子山终点站:
$ /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与更改文件名的长度一样有意义--如果不更改文件名本身,就无法做到这一点。
https://stackoverflow.com/questions/16943819
复制相似问题