Как найти файл UTI для файла без расширения пути в пути в Swift

Я пытался преобразовать этот код, который у меня был, из этого example (в Objective-c) безуспешно.

    String *path; // contains the file path

    // Get the UTI from the file's extension:

    CFStringRef pathExtension = (__bridge_retained CFStringRef)[path pathExtension];
    CFStringRef type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, NULL);
    CFRelease(pathExtension);

    // The UTI can be converted to a mime type:

    NSString *mimeType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType);
    if (type != NULL)
        CFRelease(type);

Мой код это

    import MobileCoreServices
    let path: String?
    let pathExt = path.pathExtension as CFStringRef
    let type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, NULL);
    let mimeType = UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType)
    if type != Null
            CFRelease(type)

Все, что я хочу сделать, это узнать, является ли файл изображением или видеофайлом.


person Mickey Mouse    schedule 17.02.2015    source источник
comment
Если вы посмотрите на код, который вы пытаетесь портировать, и комментарии к ответу, из которого вы его портируете, вы заметите, что он не делает то, что вам нужно — он получает расширение из имени файла, затем ищет тип MIME для этого расширения. Если вам нужна информация о типе без расширения, вам нужно просмотреть первые несколько байтов файла для магические числа. В iOS нет API для этого, но есть сторонние варианты.   -  person rickster    schedule 18.02.2015


Ответы (1)


Вы можете использовать URL метод resourceValues(forKeys:) для получения файла URL TypeIdentifierKey, который возвращает универсальный идентификатор типа файла (UTI). Вам просто нужно проверить, является ли возвращаемое значение «com.apple.m4v-video» для видео, «public.jpeg» или «public.png» для изображений и так далее. Вы можете добавить расширение свойства typeIdentifier к URL-адресу, чтобы возвращать строковое значение TypeIdentifierKey следующим образом:

Xcode 11 • Swift 5.1

extension URL {
    var typeIdentifier: String? { (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier }
    var localizedName: String? { (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName }
}
person Leo Dabus    schedule 13.01.2016