1

我有一个文件夹结构中的元素列表:

  • /文件夹/myfile.pdf
  • /文件夹/子文件夹1/myfile.pdf
  • /文件夹/子文件夹2/myfile.pdf
  • /文件夹/子文件夹3/another/myfile.pdf

我的目标是遍历结构以构建与我的文件名匹配的文件数组,但数组中第一次出现的项目将是最接近文件夹根目录的项目。

有人告诉我广度优先遍历,但我很困惑。

我开始采用这种方法,但结果不能满足我的需要......我将不胜感激任何帮助!

NSMutableArray * directories = [NSMutableArray new];
NSDirectoryEnumerator *enumerator = [[[NSFileManager defaultManager] enumeratorAtPath:url] retain] ;

if( [[filePath lastPathComponent] isEqualToString:@"myfile.pdf"] ){
    [directories addObject:[url stringByAppendingString:filePath]];
}

if(directories)
 sourceUrl_ = [[NSURL fileURLWithPath:[directoriesToWalk objectAtIndex:0] ] retain];
4

1 回答 1

2

这是一个类似于您所描述的工作示例:

NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager]
                                     enumeratorAtPath:@"/Users/bdesham/Sites"];

NSMutableArray *htmlFiles = [NSMutableArray new];

NSURL *path;
while (path = [enumerator nextObject]) {
    if ([[path lastPathComponent] isEqualToString:@"index.html"]) {
        [htmlFiles addObject:@{ @"level" : [NSNumber numberWithInteger:[enumerator level]],
                                @"path" : path }];
    }
}

[htmlFiles sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1[@"level"] integerValue] > [obj2[@"level"] integerValue];
}];

NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[htmlFiles count]];

[htmlFiles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [paths addObject:obj[@"path"]];
}];

这里的思路如下:

  1. 枚举感兴趣的文件夹中的所有文件。
  2. 对于具有所需文件名的每个文件,将其添加到htmlFiles数组中。该文件被添加为字典,以便我们可以将深度(调用的结果-[NSDirectoryEnumerator level])与每个文件名一起存储。
  3. 我们现在有一个数组,其中包含我们可能感兴趣的所有文件。
  4. 根据文件的深度(@"level"字典中的键)对数组进行排序。
  5. 我们不再需要字典中的路径名,因此创建一个仅包含路径名的新数组(但与之前的排序顺序相同)。

在这段代码的末尾,该paths数组包含NSURL所有名为“index.html”的文件的 s,其中最靠近根的文件最先,离根最远的文件最后。(请注意,同一目录级别的两个文件的数组中的顺序是未定义的。)

于 2013-08-13T19:56:48.880 回答