2013-08-13 4 views
1

У меня есть список элементов в структуре папок:Дерево обхода BFS

  • /folder/myfile.pdf
  • /folder/subfolder1/myfile.pdf
  • /папки/subfolder2/MyFile. PDF
  • /folder/subfolder3/another/myfile.pdf

Моя цель состоит в том, чтобы пересечь структуру для того, чтобы построить массив файлов, которые соответствуют моему имени файла, но когда первый occu rance элемента в массиве будет ближайшим к корню папки.

Мне рассказывали о первом проходе, но я смущаюсь.

Я начал использовать этот подход, но результат не удовлетворяет мою потребность ... Я был бы признателен за любую помощь!

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]; 
+0

Итак, у вас уже есть список файлов в 'NSArray'? Сохраняются ли они как 'NSString' или' NSURL'? – bdesham

+0

Они как строки в массиве –

ответ

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 S всех файлов с именем «index.html», с файлами самых близких к корню первого и самых удаленных от корня последнего. (Обратите внимание, что упорядочение внутри массива двух файлов на одном уровне каталогов не определено.)

+0

Блестящий! Огромное спасибо! –

Смежные вопросы