21

我试图在 Cocoa 中找到某种方式将文件扩展名转换为统一类型标识符。也就是说,我想找到一些方法:

".jpg" => "public.jpeg"
".html" => "public.html" 
".ttf"=> "public.truetype-font"

我搜索了 NSWorkspace 文档,但找不到任何东西。我能得到的最接近的是:

- (NSImage *)iconForFileType:(NSString *)fileType

返回文件扩展名的图标,以及

– (NSString *)preferredFilenameExtensionForType:(NSString *)typeName

这与我正在尝试做的完全相反。你们中有人知道怎么做吗?

我真的希望我不必手动检查很多扩展。

提前致谢。

4

2 回答 2

46

大约一周前我需要这个:

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, 
                                                                   (CFStringRef)[myFilePath pathExtension], 
                                                                   NULL);

如果我在扩展 @"php"、@"jpg"、@"html" 和 @"ttf" 上运行它,它会打印:

public.php-script
public.jpeg
public.html
public.truetype-ttf-font

11 年后更新

在 Swift 中,有两种方法可以做到这一点,具体取决于您的部署目标:

  1. 如果您想在 macOS Catalina 及更早版本(Big Sur 之前)或 iOS 13 及更早版本上运行:

    let fileExtension = "html"
    let unmanagedString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension as CFString,
                                                                fileExtension as CFString, 
                                                                nil)
    
    let typeIdentifier = unmanagedString?.takeRetainedValue() as String?
    

    UTTypeCreatePreferredIdentifierForTag()func(仍然是模块的一部分CoreServices)返回一个Unmanaged<CFString>?; 这是一种将 a起来的类型,CFString您需要(通过其中一种.take...方法)指示内存管理语义应该是什么。

    由于该函数遵循Create Rule命名模式,因此它将返回一个CFString我们需要拥有的所有权。因此,我们使用.takeRetainedValue()所有权CFString手动内存管理世界转移到 ARC 世界。

    然后有相当数量的桥接可以往返StringCFString反之亦然。

  2. macOS Big Sur(和 iOS 14)获得了一个新UniformTypeIdentifiers模块,让这一切变得更加简单:

    let fileExtension = "html"
    let typeIdentifier = UTType(filenameExtension: fileExtension)
    
于 2009-10-01T20:42:03.607 回答
15

您可以使用终端并调用mdls,它会为您提供有关特定文件类型的各种信息,包括 UTI。

mdls /myPath/to/myFile.ext

然后,mdls 将在 kMDItemContentTypeTree 中向您显示相关的 UTI(也可以从您的 Cocoa 应用程序中调用 mdls)。

于 2012-01-01T15:17:42.463 回答