如何迭代目录中的所有图像文件?

时间:2011-05-25 18:50:40

标签: iphone objective-c ios ipad filesystems

我的应用使用iTunes文件共享。用户可以将文件添加到Documents目录。

我必须阅读这些文件,但要确保它们只是图像,而不是文本文件或其他“垃圾”。

如何迭代目录中的文件并仅识别那些图像?

我认为我必须这样做:

NSMutableArray *retval = [NSMutableArray array];

NSArray *files = [fileManager contentsOfDirectoryAtPath:documentsDirPath error:&error];
if (files == nil) {
    // error...
}

for (NSString *file in files) {
    if ([file.pathExtension compare:@"png" options:NSCaseInsensitiveSearch] == NSOrderedSame) {        
        NSString *fullPath = [documentsDirPath stringByAppendingPathComponent:file];
        [retval addObject:fullPath];
    }
}

但由于某些原因这很糟糕。我需要一个HUUUUUGE if子句来捕获所有可能的图像文件类型,并且它们有DOZENS。

是否有更智能的方式来真正收集所有图像文件,无论是.png,.bmp,.jpg,.jpeg,.jpeg2000,.tiff,.raw,.etc?

我稍微记得有一些文件属性告诉一般文件类型。我相信有一些抽象的图像关键。但也许有更好的方法?

2 个答案:

答案 0 :(得分:10)

是的,你可以,只需使用Uniform Type Identifiers。这是:

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

if (UTTypeConformsTo(fileUTI, kUTTypeImage)) NSLog(@"This is an image");

CFRelease(fileUTI);

答案 1 :(得分:5)

即使文件名表示图像文件,它也不一定是图像。您可以尝试从数据中实例化UIImage,如果文件失败则拒绝该文件。