iOS 数组不完全填充

发布时间: 2017/3/21 23:01:52
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我用这两种的递归方法来查找特定文件夹中的文件和目录的路径

- (NSMutableArray *)getFilePathsFromDirectory:(NSString *)directory{
NSMutableArray *contents = [[NSMutableArray alloc] init];
NSArray *arr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
for (NSString *file in arr) {
    BOOL isDir;
    [[NSFileManager defaultManager] fileExistsAtPath:[directory stringByAppendingPathComponent:file] isDirectory:&isDir];
    if (!isDir) {
        [contents addObject:[directory stringByAppendingPathComponent:file]];
    }
    else{
        [contents addObject:[directory stringByAppendingPathComponent:file]];
        [contents addObject:[self getFilePathsFromDirectory:[directory stringByAppendingPathComponent:file]]];
    }
}
return contents;
}

- (NSString *)getPathForItemNamed:(NSString *)name array:(NSMutableArray *)arr{
NSString *str;
if (name) {
    for (NSString *s in arr) {
        if ([s isKindOfClass:[NSString class]]) {
            if ([[s lastPathComponent] isEqualToString:name]) {
                return s;
            }
        }
    }
    for (NSMutableArray *aq in arr) {
        if ([aq isKindOfClass:[NSMutableArray class]]) {
            str = [self getPathForItemNamed:name array:aq];
            return str;
        }
    }
}
return str;
}

但问题是,经过一定的子目录 (3-5),这停止返回任何路径,返回 (null) 。我觉得这就是要与不被前挤满了所有目录对于某些原因,它返回的数组。下面是我如何调用这些

NSMutableArray *paths = [self getContentsOfPaths:[self downloadsDir]];

path = [self getPathForItemNamed:[tableView cellForRowAtIndexPath:indexPath].textLabel.text array:paths];
NSLog(@"%@", path);

解决方法 1:

有两个问题你 getPathForItemNamed: 方法︰

  • 当它不能按名称查找文件时,它返回未初始化的变量的值 str 。这是未定义的行为 — — 你需要设置 strnil 初始化时。事实上,你不需要 str 在所有 (见下面的修复程序)。
  • 当它发现它第一次的子目录时,它假定它寻找该文件必须是该子目录中,即使它不是。无论第一级递归调用的 getPathForItemNamed: 返回,成为顶级的调用的返回结果。这是坏消息︰ 如果你正在寻找的文件是第二个子目录中的子树中,你永远不会找到它 !

这里是你该如何解决您的方法︰

- (NSString *)getPathForItemNamed:(NSString *)name array:(NSMutableArray *)arr{
    if (!name) return nil;
    for (NSString *s in arr) {
        if ([s isKindOfClass:[NSString class]]) {
            if ([[s lastPathComponent] isEqualToString:name]) {
                return s;
            }
        }
    }
    for (NSMutableArray *aq in arr) {
        if ([aq isKindOfClass:[NSMutableArray class]]) {
            str = [self getPathForItemNamed:name array:aq];
            // Return something only when you find something
            if (str) return str;
        }
    }
    return nil; // You do not need str at all.
}
官方微信
官方QQ群
31647020