免费开源的iOS开发学习平台

OC文件管理:3-枚举目录中的内容

查看某个文件夹中的文件列表,在文件操作中是被高频使用的,在DOS中我们可以使用DIR命令,在Linux中可以使用ls命令,在iOS开发中,我们可以使用enumeratorAtPath:方法以及contentsOfDirectoryAtPath:方法,这两个方法都可以完成对指定目录的文件列表枚举,但使用中稍有差别。

enumeratorAtPath:方法

当使用enumeratorAtPath:时,一次可以枚举指定目录中的所有文件,包括子目录中的文件。该方法的返回值类型为一个NSDirectoryEnumerator类型的对象,可以使用nextObject方法来取出其中的值。

- (nullable NSDirectoryEnumerator<NSString *> *)enumeratorAtPath:(NSString *)path;

示例代码:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSFileManager *fm = [NSFileManager defaultManager];
        //变更当前目录到桌面Desktop
        NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDesktopDirectory, NSUserDomainMask, YES);
        NSString * desktopPath = [paths objectAtIndex:0];
        [fm changeCurrentDirectoryPath:desktopPath];
        //使用enumeratorAtPath
        NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:desktopPath];
        NSString *path;
        while ((path = [dirEnum nextObject]) != nil) {
            NSLog(@"%@",path);
        }
    }
    return 0;
}

运行结果如下,可以看到子目录中的文件也被列举出来了。

contentsOfDirectoryAtPath:方法

当使用contentsOfDirectoryAtPath:方法时,也可以列出当前目录中的文件和文件夹名称,但子文件夹中的内容并不显示。该方法的返回值是一个NSArray类型的数组,因此可以使用forin循环来遍历其中的对象。

- (nullable NSArray<NSString *> *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

示例代码:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSFileManager *fm = [NSFileManager defaultManager];
        //变更当前目录到桌面Desktop
        NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDesktopDirectory, NSUserDomainMask, YES);
        NSString * desktopPath = [paths objectAtIndex:0];
        [fm changeCurrentDirectoryPath:desktopPath];
        //获取目录中的文件以及子目录名称
        NSArray *dirArray = [fm contentsOfDirectoryAtPath:desktopPath error:nil];
        //遍历打印目录
        NSString *path;
        for (path in dirArray) {
            NSLog(@"%@",path);
        }
    }
    return 0;
}

运行结果如下,对比上面使用enumeratorAtPath:方法的代码,可以看到子目录中的文件并不显示。

示例代码

https://github.com/99ios/4.7.3