2013-04-10 2 views
0

Я пытаюсь прочитать каталоги, а затем получить путь к файлам в этих каталогах. Проблема заключается в том, я не знаю, сколько подкаталогов может быть в папке, и этот кодiOS Читайте несколько подкаталогов

NSString *path; 
if ([[NSFileManager defaultManager] fileExistsAtPath:[[self downloadsDir] stringByAppendingPathComponent:[tableView cellForRowAtIndexPath:indexPath].textLabel.text]]) { 
    path = [[self downloadsDir] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", [tableView cellForRowAtIndexPath:indexPath].textLabel.text]]; 
} 
else{ 
    for (NSString *subdirs in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self downloadsDir] error:nil]) { 
     BOOL dir; 
     [[NSFileManager defaultManager] fileExistsAtPath:[[self downloadsDir] stringByAppendingPathComponent:subdirs] isDirectory:&dir]; 
     if (dir) { 
      for (NSString *f in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[self downloadsDir] stringByAppendingPathComponent:subdirs] error:nil]) { 
       if ([f isEqualToString:[tableView cellForRowAtIndexPath:indexPath].textLabel.text]) { 
        path = [[self downloadsDir] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%@", subdirs, f]]; 
       } 
      } 
     } 
    } 
} 

читает только до одного подкаталога, и дает мне путь к файлу им ищут. Я не могу найти способ лучше, чем это, чтобы получить несколько подкаталогов и пути файлов в этих каталогах. Может кто-нибудь помочь с этим? Вот что им пытаются сделать

+Downloads Folder+ 
    +File1+ //I can get the path for this 
    +Directory1+ 
     +Directory2+ 
      +File3+ // I want to get the path for this, but don't know how 
     +File2+ // I can get the path for this 

Я чувствую, что если я просто повторять для цикла, который получает содержимое каталога, я, возможно, проблема в конечном счете.

+0

Обычно вы будете использовать рекурсию или очереди, чтобы сделать это. – Dave

+0

@Dave Я думал, что рекурсия будет лучшим способом, но я не уверен, как бы я это сделал. –

+0

это не сложно, просто поместите свой код в функцию и сделайте так, чтобы он вызывал себя с новым каталогом для поиска, когда он находит каталог. Очереди лучше, но рекурсия более интуитивная. – Dave

ответ

1

Существует концепция под названием recursion, которая обычно применяется к таким проблемам, как эта. В принципе, вы называете этот самый метод для каждого из подкаталогов, который, в свою очередь, вызовет для каждого из под-подкаталогов и т. Д.

Важно то, что вы определяете точку останова, чтобы она не продолжалась вечно. Кажется, хорошей точкой остановки является файл или пустой каталог.

В псевдокоде:

method storePaths(directory) 
    for each element in directory 
     if element is a file 
      store path 
     else if element not empty directory 
      call storePaths(element) 
+0

Вот что я в итоге сделал, спасибо. –

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