Objective c 获取给定扩展的统一类型标识符
我试图在Cocoa中找到某种方法,将文件扩展名转换为统一类型标识符。也就是说,我想找到这样做的方法: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 返回文件扩展名的图标,然后
".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中,有两种方法可以实现这一点,具体取决于您的部署目标:
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
有相当数量的桥接,反之亦然
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我为你更新了答案。