Получить тип файла в Какао - PullRequest
27 голосов
/ 28 апреля 2011

Мне удалось найти расширенный тип файла для указанного файла (изображение JPEG, изображение TIFF, ...), но я ищу что-то более общее, что может классифицировать файлы в «больших категориях», такие как изображения, фильмы, текстовые файлы ... Есть ли способ добиться этого в какао (или цель-с)?

Спасибо за вашу помощь,

Ответы [ 5 ]

68 голосов
/ 28 апреля 2011

Вы можете использовать Унифицированные идентификаторы типов .Поскольку UTI организованы в иерархии, одна возможность состоит в том, чтобы проверить, соответствует ли предпочтительный UTI для данного файла UTI верхнего уровня, например, public.image для изображений или public.movie для фильмов.Инфраструктура базовых служб включает функции, которые работают с UTI, а также константы, представляющие известные UTI.

Например, работа с расширениями имени файла:

NSString *file = @"…"; // path to some file
CFStringRef fileExtension = (CFStringRef) [file pathExtension];
CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);

if (UTTypeConformsTo(fileUTI, kUTTypeImage)) NSLog(@"It's an image");
else if (UTTypeConformsTo(fileUTI, kUTTypeMovie)) NSLog(@"It's a movie");
else if (UTTypeConformsTo(fileUTI, kUTTypeText)) NSLog(@"It's text");

CFRelease(fileUTI);

Если вместо MIME используется тип MIMEрасширение имени файла, вы можете использовать kUTTagClassMIMEType вместо kUTTagClassFilenameExtension.

Список известных UTI см. в этом документе .

12 голосов
/ 18 августа 2011
[[NSWorkspace sharedWorkspace] typeOfFile:pathToFile error:nil]
6 голосов
/ 26 августа 2014

Вы также можете определить тип изображения без , полагаясь на расширение пути с помощью CGImageSource (часть инфраструктуры ImageIO).

В следующем примере используется URL-адрес файла, но вы также можете создать источник изображения из CFDataRef.

CFStringRef typeOfImageAtURL(NSURL *imageURL) {
    const void * keys[] = { kCGImageSourceShouldCache };
    const void * values[] = { kCFBooleanFalse };
    CFDictionaryRef options = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, NULL, NULL);
    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, options);
    CFStringRef imageType = CGImageSourceGetType(imageSource);
    CFRelease(options);
    CFRelease(imageSource);
    return imageType;
}

Возвращаемое значение будет константой, которую можно сравнить со значениями идентификатора унифицированного типа, объявленными в CoreServices / MobileCoreServices (например, kUTTypeJPEG, kUTTypeGIF и т. Д.).

Глазурь на торте: вы можете передать необязательный UTI с «подсказкой», если у вас есть причина ожидать тот или иной тип файла.Комбинируйте этот подход с Bavarious ', и вы получите компактную машину для определения среднего формата изображения.

5 голосов
/ 02 января 2013

Пример, чтобы проверить, является ли путь типом изображения, может быть изменен, чтобы соответствовать другим классам UTI. Обратите внимание на Техническую ноту. Технические вопросы и ответы QA1518 использует FSPathMakeRef, который в настоящее время устарел для получения UTI через LSCopyItemAttributes - приведенное выше решение NSWorkspace - лучший способ получить UTI, тогда вам просто нужно добавить код для сравнения со списком UTI: массив может быть предварительно выделен и инициализирован / освобожден в другом месте, если это необходимо)

- (BOOL)isImageFile:(NSString*)filePath
{
/* get an array of utis to match against, this gets supported CG/NS image formats */

CFArrayRef supportedTypes = CGImageSourceCopyTypeIdentifiers();
CFIndex    typeCount      = CFArrayGetCount(supportedTypes);

/* get the uti of the filepath and check against the list with the UTI API */

BOOL isImage     = NO;
NSString * uti   = [[NSWorkspace sharedWorkspace] typeOfFile:filePath error:nil];

if ( uti != nil){
    for (CFIndex i = 0; i < typeCount; i++)
    {
        CFStringRef supportedUTI = CFArrayGetValueAtIndex(supportedTypes, i);
        if (UTTypeConformsTo(supportedUTI, CFSTR("public.image")))
        {
            if (UTTypeConformsTo((CFStringRef)uti, supportedUTI))
            {
                isImage = YES;
                break;
            }
        }
    } // i
}
/* clean up */
CFRelease(supportedTypes);
return isImage;
}
3 голосов
/ 28 апреля 2011

Будет получен «вид» файла.

+ (NSString *)humanReadableFileType:(NSString *)path{
    NSString *kind = nil;
    NSURL *url = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]];
    LSCopyKindStringForURL((CFURLRef)url, (CFStringRef *)&kind);
    return kind ? [kind autorelease] : @"";
}

Источник : http://importantshock.wordpress.com/2007/01/07/cocoa-snippet-finding-a-files-kind/#post-19

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...