我正在尝试从给定的起始路径建模文件系统的结构。目标是从该路径开始创建文件系统的标准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
构建模型?我的意思是,据说这就是班级存在的原因,对吗?
答案 0 :(得分:0)
可以使用另一种目录枚举:
enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:
此枚举器具有其他有用的选项,并允许使用预取属性迭代NSURL实例,例如NSURLNameKey
,NSURLIsDirectoryKey
,NSURLParentDirectoryURLKey
等...它可能有助于摆脱递归使用。
答案 1 :(得分:-2)
如果该文件是目录,则需要创建新的目录枚举器; NSDirectoryEnumerator枚举一个目录,而不是系统上的每个目录。 所以,是的,你将不得不使用递归。