21

私はCocoaで、ファイル拡張子からUniformTypeIdentifiersに変換する方法を見つけようとしています。つまり、これを行う方法を見つけたいと思います。

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

NSWorkspaceのドキュメントを検索しましたが、何も見つかりませんでした。私が得ることができた最も近いものは:

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

ファイル拡張子のアイコンを返し、

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

それは私がやろうとしていることとは正反対です。これを行う方法を知っている人はいますか?

手作業で多くの拡張機能をチェックする必要がないことを本当に望んでいます。

前もって感謝します。

4

2 に答える 2

46

約1週間前にこれが必要でした:

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 では、展開ターゲットに応じて、これを行う 2 つの方法があります。

  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あり、(メソッドの 1 つを介して.take...) メモリ管理セマンティクスがどうあるべきかを示す必要があります。

    この関数は Create Rule命名パターンに従っているCFStringため、所有権を取得する必要がある が返されます。したがって、 の所有権を手動メモリ管理の世界から ARC の世界に移す.takeRetainedValue()ために使用します。CFString

    String次に、からへCFString、またはその逆に行くためのかなりの量のブリッジングがあります。

  2. macOS Big Sur (および iOS 14) には、UniformTypeIdentifiersこれをより簡単にする新しいモジュールが追加されました。

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

ターミナルを使用して、UTI を含む特定のファイル タイプに関するあらゆる種類の情報を提供するmdlsを呼び出すことができます。

mdls /myPath/to/myFile.ext

mdls は、関連付けられている UTI を kMDItemContentTypeTree に表示します (Cocoa アプリ内から mdls を呼び出すこともできます)。

于 2012-01-01T15:17:42.463 に答える