Obtener el tipo de archivo en Cocoa

Logré encontrar el tipo de archivo extendido de un archivo especificado (JPEG, TIFF, …) pero estoy buscando algo más genérico que pueda categorizar archivos en “grandes categorías” como imágenes, videos, archivos de texto, etc. ¿Hay alguna forma de lograr esto en cocoa (u objective-c)?

Gracias por tu ayuda,

Podría usar identificadores de tipo uniforme . Dado que las UTI están organizadas en jerarquías, una posibilidad es verificar si la UTI preferida para un archivo dado se ajusta a una UTI de nivel superior, por ejemplo public.image para imágenes o public.movie para películas. El marco de servicios básicos incluye funciones que operan en UTI así como constantes que representan UTI conocidas.

Por ejemplo, trabajando en extensiones de nombre de archivo:

 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); 

Si tiene un tipo MIME en lugar de una extensión de nombre de archivo, puede usar kUTTagClassMIMEType lugar de kUTTagClassFilenameExtension .

Para obtener una lista de UTI conocidas, consulte este documento .

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

También puede determinar el tipo de imagen sin depender de la extensión de ruta con CGImageSource (parte del framework ImageIO).

El siguiente ejemplo usa una URL de archivo, pero también puede crear una fuente de imagen desde 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; } 

El valor de retorno será una constante que puede comparar con los valores de identificador de tipo uniforme declarados en CoreServices / MobileCoreServices (por ejemplo, kUTTypeJPEG, kUTTypeGIF, etc.).

La guinda del pastel: puede pasar una UTI “sugerencia” opcional si tiene motivos para anticipar un tipo de archivo u otro. Combine este enfoque con Bavarious ‘y tendrá una máquina de detección de formato de imagen delgada y delgada.

Ejemplo para comprobar si una ruta es un tipo de imagen, se puede cambiar para que coincida con otras clases de UTI. Tenga en cuenta la nota técnica Q & A1518 técnica QA1518 utiliza FSPathMakeRef que ahora está en desuso para obtener el uti a través de LSCopyItemAttributes – la solución NSWorkspace anterior es la mejor manera de obtener la UTI, entonces solo necesita agregar código para comparar con una lista de UTI: (la coincidencia la matriz se puede preasignar e inicializar / liberar en otro lugar si así lo desea)

 - (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; } 

Esto obtendrá el ‘tipo’ de archivo.

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

Fuente : http://importantshock.wordpress.com/2007/01/07/cocoa-snippet-finding-a-files-kind/#post-19