如何使用cocoa中的contentsOfDirectoryAtPath从文件夹中获取内容列表?

时间:2018-01-25 10:58:22

标签: objective-c cocoa nsfilemanager

我想获取文件夹的所有内容并添加到NSMenuItems的子菜单。

为实现这一目标,我使用下面给出的代码:

NSArray *dirContents = [[NSArray alloc]init];
dirContents=[[NSFileManager defaultManager] contentsOfDirectoryAtPath:updated error:nil];

此代码正常运行,但仅限于一个文件夹。奇怪但确实如此。我为其他文件夹尝试了相同的代码,但它在dirContents中提供了nil值。

那么如何访问所选文件夹的所有内容列表呢?

2 个答案:

答案 0 :(得分:0)

尝试此操作以跟踪访问错误。

NSError *error;
NSArray *dirContents = [[NSArray alloc]init];
dirContents=[[NSFileManager defaultManager] contentsOfDirectoryAtPath:updated error:&error];

if(error){
    NSLog(@"%@",error);
}

如果应用程序是沙箱,而不是绝对路径,请确保使用目录的相对路径。

NSURL *containerUrl =[[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"Your.app.container.id"];
path = [[containerUrl URLByAppendingPathComponent:@"your/folder/path"] path];

答案 1 :(得分:0)

+(NSArray*)allURLs:(NSURL*)url{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
    NSURL *bundleURL = url;
    NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:bundleURL
                                          includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
                                                             options:NSDirectoryEnumerationSkipsHiddenFiles
                                                        errorHandler:^BOOL(NSURL *url, NSError *error)
                                         {
                                             NSLog(@"[Error] %@ (%@)", error, url);
                                             return url;
                                         }];

    NSMutableArray *mutableFileURLs = [NSMutableArray array];
    for (NSURL *fileURL in enumerator) {
        NSString *filename;
        [fileURL getResourceValue:&filename forKey:NSURLNameKey error:nil];

        NSNumber *isDirectory;
        [fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];

        // Skip directories with '_' prefix, for example
        if ([filename hasPrefix:@"_"] && [isDirectory boolValue]) {
            [enumerator skipDescendants];
            continue;
        }

        if (![isDirectory boolValue]) {
            [mutableFileURLs addObject:fileURL];
        }
    }


    return mutableFileURLs;
}