Macos UTI来自哪里?

Macos UTI来自哪里?,macos,uti,Macos,Uti,我已经读了很多博客文章,所以有关于统一类型标识符和OSX如何处理文件类型的问题。然而,仍然有一些事情我不明白: 系统如何为每个文件创建UTI?作为开发人员,我被动地为我的文件类型声明一个UTI,但系统负责为每个匹配的文件分配UTI。 我目前的印象是,查找器根据文件扩展名动态创建UTI UTI存储在文件系统级别的何处?我了解到UTI可以通过mdls命令显示。这是否意味着UTI是沿着聚光灯元数据存储的?如果聚光灯关闭了怎么办 没有API手动添加或更改特定文件的UTI是否正确 事实上,它没有那么大的

我已经读了很多博客文章,所以有关于统一类型标识符和OSX如何处理文件类型的问题。然而,仍然有一些事情我不明白:

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

  • UTI存储在文件系统级别的何处?我了解到UTI可以通过
    mdls
    命令显示。这是否意味着UTI是沿着聚光灯元数据存储的?如果聚光灯关闭了怎么办

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


    • 事实上,它没有那么大的魔力。您已经问了几个不同的问题,因此我将尝试给出每个问题的答案:

      系统如何为每个文件创建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字段。例如,当您通过
      -[NSWorkspace typeofile:error:
      -[NSURL getResourceValue:forKey:error:
      请求Cocoa获取文件的UTI时,它实际上从文件名中提取路径扩展名,然后调用
      UTTypeCreatePreferredIdentifierForTag()
      ,以获取相关的UTI。(比这要复杂一点,因为它还考虑路径是否指向目录、设备文件或其他内容,但这是基本思想。)

      这是否意味着UTI是沿着聚光灯元数据存储的?如果聚光灯关闭怎么办?

      Spotlight确实将文件的UTI保存在其数据库中,但这只是为了让它能够按类型快速搜索和过滤。与聚光灯索引中的其他内容一样,这些信息也不规范;它只是用来快速搜索实际上存储在别处的数据。如果你关掉聚光灯,没关系,其他一切都取决于它

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


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

      您阅读过Apple参考资料吗?我当然读过参考资料。但它只解释了UTI的结构以及如何在应用程序中声明它们。我想知道的是它们在文件系统级别上是如何工作的。我更新了我的问题,让它更清楚一点。谢谢!这就是我想知道的。