Использование NSDirectoryEnumerator для моделирования файловой системы - PullRequest
1 голос
/ 05 сентября 2011

Я пытаюсь смоделировать структуру файловой системы по заданному начальному пути.Цель состоит в том, чтобы создать стандартную NSOutlineView файловую систему с этого пути и далее.

У меня есть объект модели с именем fileSystemItem.Он имеет следующие (очень стандартные) отношения и свойства:

  • parentItem (указывает на другой объект fileSystemItem)
  • isLeaf (YES для файлов; NO для папок)
  • childrenItems (массив других fileSystemItems)
  • fullPath (NSString; путь к файлу объекта)

Мой вопрос: как я могу использовать NSDirectoryEnumerator для построения модели?Если я сделаю это:

// NOTE: can't do "while (file = [dirEnum nextObject]) {...} because that sets 
// file to an auto-released string that doesn't get released until after ALL 
// iterations of the loop are complete. For large directories, that means our 
// memory use spikes to hundreds of MBs. So we do this instead to ensure that 
// the "file" string is released at the end of each iteration and our overall 
// memory footprint stays low.

NSDirectoryEnumerator *dirEnum = [aFileManager enumeratorAtPath:someStartingPath];
BOOL keepRunning = YES;
while (keepRunning)
{
    NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];

    NSString *file = [dirEnum nextObject];
    if (file == nil) break;

    // ... examine "file". Create a fileSystemItem object to represent this item.
    // If it's a folder, we need to create a fileSystemItem for each item in the folder
    // and each fileSystemItem's "parentItem" relationship needs to be set to the 
    // fileSystemItem we're creating right here for "file." How can I do this inside
    // the directoryEnumerator, because as soon as we go to the next iteration of the    
    // loop (to handle the first item in "file" if "file" is a folder), we lose the  
    // reference to the fileSystemItem we created in THIS iteration of the loop for 
    // "file". Hopefully that makes sense... 

    [innerPool drain];
}

Я смогу увидеть, как построить модель, если напишу рекурсивную функцию, которая просматривает каждый элемент в startingPath и, если этот элемент является папкой, снова вызывает себяэта папка и так далее.Но как я могу построить модель с NSDirectoryEnumerator?Я имею в виду, возможно, именно поэтому класс существует, верно?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2013

Можно использовать другой вид перечисления каталогов:

enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:

Этот перечислитель имеет дополнительные полезные опции и позволяет перебирать экземпляры NSURL с предварительно выбранными атрибутами, такими как NSURLNameKey, NSURLIsDirectoryKey, NSURLParentDirectoryURLKey и т. Д. ... Это может помочь избавиться от использования рекурсии.

0 голосов
/ 08 января 2012

Если этот файл является каталогом, вам необходимо создать новый перечислитель каталога;NSDirectoryEnumerator перечисляет один каталог, а не каждый каталог в системе.Так что да, вам придется использовать рекурсию.

...