7

我正在编写一个使用Uniform Type Identifiers的应用程序。具体来说,我正在调用UTTypeCreateAllIdentifiersForTag()并传递各种MIME类型。

我希望这个函数(不同于UTTypeCreatePreferredIdentifierForTag())会给我最具体的 UTI 以及它符合的所有 UTI。情况似乎并非如此——它要么返回单个 UTI,要么次要 UTI 是虚假的。

在同一个头文件中定义了该UTTypeConformsTo()函数,但我更喜欢一个函数,该函数返回该 UTI 符合的所有类型的数组。

我似乎有希望,因为MDItemCopyAttributeList()将返回这样的列表。也就是说,它需要一个MDItemRef,它可以从文件路径或 URL 创建——这不是很好。有时我的数据只存储在内存中,我只有一个 MIME 类型可供使用。

我是否必须遍历整个 UTI 数据库才能获取此信息,还是我遗漏了什么?

4

2 回答 2

7

我确实错过了一些东西:非常明显的解决方案。当我浏览由LaunchServices(并注意到有趣但私有的UTTypeCopyPedigree())导出的符号时,我想起了UTTypeCopyDeclaration(),它定义的。

UTTypeCopyDeclaration()给定一个 UTI 并返回(作为 a CFDictionaryRef)定义 UTI 的属性列表。此字典中带有键的对象kUTTypeConformsToKey是 aCFArrayRefCFStringRef。在数组的情况下,可以递归迭代直到达到基本类型。

这就是我为给定 UTI 构建继承树的方式。我希望这可以帮助其他有同样问题的人。

于 2010-10-22T00:38:05.563 回答
0

https://github.com/nst/UTIsExplorer以“点”格式为 graphviz 生成 UTI 的层次结构图。

于 2016-02-09T00:44:47.520 回答