我在文件夹结构中有一个元素列表:
我的目标是遍历结构,以构建与我的文件名匹配的文件数组,但是该项目在数组中首次出现的位置将是最接近文件夹根目录的位置。
有人告诉我广度优先遍历,但我感到困惑。
我开始采用这种方法,但结果不能满足我的需求……我将不胜感激!
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];
最佳答案
这是类似您所描述内容的工作示例:
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"]];
}];
这里的想法如下:
htmlFiles
数组中。该文件将作为字典添加,以便我们可以将深度(调用-[NSDirectoryEnumerator level]
的结果)与每个文件名一起存储。 @"level"
键)对数组进行排序。 在这段代码的最后,
paths
数组包含名为“index.html”的所有文件的NSURL
,文件最靠近根,最后离根最远。 (请注意,在同一目录级别的两个文件的数组中的顺序是未定义的。)