iOS: 从文档目录获取文件名到 NSMutableArray

iOS: get filenames from documents directory into NSMutableArray

下面是我正在尝试做的事情的概述。我的应用程序上有一个表单,表单数据在文档目录中保存为 .csv 文件。我想解析文档目录并获取 .csv 文件的文件名。然后我想在 UITableView 中显示这些文件名,以便用户可以选择要附加到电子邮件的文件。我在将文件名放入 NSMutableArray 时遇到了一些问题。下面是我的代码:

NSString *extension = @"csv";

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError *error = nil;
NSArray *documentArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:&error];

NSLog(@"files array %@", documentArray);

NSString *filename;

for (filename in documentArray) {
    if ([[filename pathExtension] isEqualToString:extension])
    {
        [_mySingleton.filePathsArray addObject:filename];
    }
}

NSLog(@"files array %@", _mySingleton.filePathsArray);

第一个 NSlog returns 看起来是文件夹中的所有文件名。在第二个 NSlog 中,它应该只打印 .csv 文件名,而不是返回 null。显然 for 循环中的代码不起作用,我该如何解决?我也希望它不会造成混淆,我有一个单例 class,在这种情况下,我将文件名存储在其中,以便可以在多个视图中编辑和访问它们。

谢谢, 亚历克斯

你写了

In the second NSlog it should only be printing the .csv filenames, instead it is returning null.

表示_mySingleton.filePathsArray没有初始化。如果它将被初始化,NSLog 将打印一个空数组,而不是 null.

你必须做的 - 在使用之前在某处添加 _mySingleton.filePathsArray 初始化:

_mySingleton.filePathsArray = [NSMutableArray new];

尝试使用内置的过滤功能

NSArray *files = @[@"11.csv", @"22.txt", @"333.csv", @"444.doc"];
NSArray *cvsFiles = [files filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject hasSuffix:@".csv"];
}]];
NSLog(@"%@", cvsFiles);

并且在您的代码中,filePathsArray 将只有文件名。您应该将目录路径附加到。

[_mySingleton.filePathsArray addObject:[documentsDirectory stringByAppendingPathComponent:filename];

完整版

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *documentArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil];
NSArray *cvsFiles = [documentArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject hasSuffix:@".csv"];
}]];
NSMutableArray *filePaths = [@[] mutableCopy];
for (NSString *fileName in cvsFiles) {
    [filePaths addObject:[documentsDirectory stringByAppendingPathComponent:fileName]];
}
_mySingleton.filePathsArray = filePaths