iPhone - 如何检查文件是目录、音频、视频还是图像?

36

使用我的程序可以显示Documents目录的内容,并在tableView中显示。 但是Documents目录包含一些子目录、音频、视频、图片等。

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
fileType = @"" ;
NSString *subDirectoryPath = [docsDir stringByAppendingPathComponent:fileType];
NSLog(@"path : %@",subDirectoryPath);
files  = [[NSMutableArray alloc] initWithArray:[[NSFileManager defaultManager] contentsOfDirectoryAtPath:subDirectoryPath error:nil]];
NSLog(@"files ::::: %@ ",[files description]);

所以,我想检查文件是否为目录,如果是,则可以在单元格的imageView中显示目录图像。音频、视频和图像同理。

我在NSFileManager类引用中进行了搜索,但没有找到解决方案。

如何做到这一点?


请查看 我的Swift 4.2和iOS 12的答案,其中展示了最多4种不同的方法来检查URL是否表示文件或目录。 - Imanou Petit
6个回答

56

示例代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *directory = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory];
BOOL isDirectory;
for (NSString *item in directory){
    BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:item isDirectory:&isDirectory];
    if (fileExistsAtPath) {
       if (isDirectory)
       {
           //It's a Directory.
       }
    }
    if ([[item pathExtension] isEqualToString:@"png"]) {
       //This is Image File with .png Extension
    }
}

你可以像Bavarious在这里所解释的那样,使用统一类型标识符(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(@"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);

如果音频文件是...vin...格式,怎么办?因为存在多种扩展名的音频文件,我们该怎么做呢? - Nitin Gohel
@NitinGohel:嘿,兄弟,我想他必须比较所有这些扩展名,我猜!!! - Bhavin
那段第一段代码是错误的。if (fileExistsAtPath) 需要嵌套另一个测试:if (isDirectory) { _here_ 你知道它是一个文件夹 } - Basil Bourque
@BasilBourque:我当时只是忘记了那部分。现在已经解决了。感谢您的纠正。 - Bhavin
这对我不起作用。 "item"只是一个带有最后路径组件的字符串。请改用以下代码: `NSString * path = [documentsDirectory stringByAppendingPathComponent:item]; BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];` - olynoise
显示剩余6条评论

3

对于任何喜爱Swift的人,如果想要检查一个文件是否是一个目录,可以使用以下代码:

///
/// Check if NSURL is a directory
///
internal func fileIsDir(fileURL: NSURL) -> Bool {
    var isDir: ObjCBool = false;
    fileManager.fileExistsAtPath(fileURL.path!, isDirectory: &isDir)
    return Bool(isDir);
}

///
/// Check if a path is a directory
///
internal func fileIsDir(path: String) -> Bool {
    var isDir: ObjCBool = false;
    fileManager.fileExistsAtPath(path, isDirectory: &isDir)
    return Bool(isDir);
}

(请注意,我试过使用return isDir as Bool,但它不起作用。但是,上述的Bool初始化似乎可以工作。)

2
不确定这是否是Swift 3中的新API。我执行了return isDir.boolValue - Zhao

3

更新 Evdzhan 的答案以适用于 Swift 4.0:

//
// Check if NSURL is a directory
//
func fileIsDir(fileURL: NSURL) -> Bool {
    var isDir: ObjCBool = false;
    FileManager.default.fileExists(atPath: fileURL.path!, isDirectory: &isDir)
    return isDir.boolValue
}

//
// Check if a path is a directory
//
func fileIsDir(path: String) -> Bool {
    var isDir: ObjCBool = false;
    FileManager.default.fileExists(atPath: path, isDirectory: &isDir)
    return isDir.boolValue
}

3

看一下 NSURL 类。你可以通过调用 isFileUrl 来判断这个 url 是否为文件 url。

此外,你还可以通过以下方式获取 url 的最后一个组件(通常是文件名):

NSString *filename = [[url path] lastPathComponent];

这些可以帮助你完成需要的工作,但更重要的是查看 NSURL 文档。


+1 对于一个字符串/路径答案,不依赖于 fileExistsAtPath()(该函数被沙盒阻止)的解决方案。如果能提供 lastPathComponent 的预期值,答案将更加完善... 空字符串是否等同于文件夹? - pkamb

3

仅适用于图像文件类型

-(BOOL)isImageSource:(NSURL*)URL
{
    CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)URL, NULL);
    NSString *UTI = (__bridge NSString*)CGImageSourceGetType(source);
    CFRelease(source);

    CFArrayRef mySourceTypes = CGImageSourceCopyTypeIdentifiers();
    NSArray *array = (__bridge NSArray*)mySourceTypes;
    CFRelease(mySourceTypes);

    return [array containsObject:UTI];
}

0

如果你真的想确定它是一张图片

if let _ =  UIImage(contentsOfFile: url.path){// is image} 

或在 Mac 上使用 NSImage


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接