Получить тип файла в Cocoa

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

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

Вы можете использовать Uniform Type Identifiers . Поскольку 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 вместо расширения имени файла, вы можете использовать kUTTagClassMIMEType вместо kUTTagClassFilenameExtension .

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

 [[NSWorkspace sharedWorkspace] typeOfFile:pathToFile error:nil] 

Вы также можете определить тип изображения, не полагаясь на расширение пути с помощью CGImageSource (часть frameworks 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 ‘, и у вас будет скудная машина для определения формата изображения.

Пример проверки того, является ли путь типом изображения, может быть изменен в соответствии с другими classами UTI. Обратите внимание на Техническую ноту Техническое Q & A 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; } 

Это получит «вид» файла.

 + (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

  • Что означают знаки плюс и минус в Objective C рядом с методом?
  • Тестирование нуля в Objective-C - if (x! = Nil) vs if (x)
  • Objective C - цикл для изменения текста метки
  • Как добавить знак процента в NSString
  • Давайте будем гением компьютера.