Objective c 获取给定扩展的统一类型标识符

Objective c 获取给定扩展的统一类型标识符,objective-c,cocoa,macos,uti,Objective C,Cocoa,Macos,Uti,我试图在Cocoa中找到某种方法,将文件扩展名转换为统一类型标识符。也就是说,我想找到这样做的方法: ".jpg" => "public.jpeg" ".html" => "public.html" ".ttf"=> "public.truetype-font" 我搜索了NSWorkspace文档,但没有找到任何内容。我能得到的最接近的结果是: - (NSImage *)iconForFileType:(NSString *)fileType 返回文件扩展名的图标,然后

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

".jpg" => "public.jpeg"
".html" => "public.html" 
".ttf"=> "public.truetype-font"
我搜索了NSWorkspace文档,但没有找到任何内容。我能得到的最接近的结果是:

- (NSImage *)iconForFileType:(NSString *)fileType
返回文件扩展名的图标,然后

– (NSString *)preferredFilenameExtensionForType:(NSString *)typeName
这与我想做的恰恰相反。你们知道怎么做吗

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


提前谢谢。

大约一周前我需要这个:

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中,有两种方法可以实现这一点,具体取决于您的部署目标:

  • 如果您想在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
    模块的一部分)返回一个
    非托管?
    ;这是一种将
    CFString
    框起来的类型,您需要指示(通过
    .take…
    方法之一)内存管理语义应该是什么

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

    然后,从
    String
    CFString
    有相当数量的桥接,反之亦然

  • macOS Big-Sur(和iOS 14)获得了一个新的
    UniformTypeIdentifiers
    模块,使其更加简单:

    let fileExtension = "html"
    let typeIdentifier = UTType(filenameExtension: fileExtension)
    

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

    mdls /myPath/to/myFile.ext
    
    然后,mdls将在kMDItemContentTypeTree中显示关联的UTI
    (顺便说一句,您也可以从Cocoa应用程序中调用MDL)。

    请不要忘记,因为函数名中包含
    Create
    ,所以您负责
    发布
    对象。谢谢!成功了。起初我遇到了一些问题,但这是因为我没有从路径字符串中删除空格和换行符。(我正在从命令行工具中读取它们。)我今天刚刚需要它。:-)如果您这样包装它,它甚至更干净:
    NSString*uti=[NSMakeCollectable(UTTypeCreatePreferredIdentifierForTag(kuttagclassfilenamextension,(CFStringRef)[myFilePath pathExtension],NULL])autorelease]
    你应该知道,为了让这个代码片段在iOS上运行,你必须
    #import
    @blackjacx我为你更新了答案。