我已经成功找到了指定文件(JPEG图像、TIFF图像等)的扩展文件类型,但我正在寻找一些更通用的方法,可以将文件分类为“大类别”,例如图像、电影、文本文件等。
有没有办法在Cocoa(或Objective-C)中实现这一点?
感谢您的帮助。
我已经成功找到了指定文件(JPEG图像、TIFF图像等)的扩展文件类型,但我正在寻找一些更通用的方法,可以将文件分类为“大类别”,例如图像、电影、文本文件等。
有没有办法在Cocoa(或Objective-C)中实现这一点?
感谢您的帮助。
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]
检查路径是否为图像类型的示例,可以更改以匹配其他UTI类。请注意,Tech Note Technical Q&A QA1518使用FSPathMakeRef获取uti,但现在已被弃用,可以通过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;
}
使用ImageIO框架的CGImageSource,您可以确定图像类型而无需依赖路径扩展名。
以下示例使用文件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'结合使用,您将拥有一个精简而高效的图像格式检测机器。
+ (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
这是一个关于如何查找文件类型的Cocoa代码片段。它通过获取文件的UTI(Uniform Type Identifier)并将其与系统预定义的UTI进行比较来确定文件类型。如果找不到匹配项,则返回“unknown”作为文件类型。
UTTypeCreatePreferredIdentifierForTag
在找不到合适的UTI时返回以“dyn”前缀开头的动态类型(例如,对于MKV)。 - Alex