NSDirectoryEnumerator 并枚举整个根卷

NSDirectoryEnumerator and enumerate entire root volume

我正在尝试使用 NSDirectoryEnumerator 枚举我的整个根卷以获取所有文件的数组。虽然这可以做到,但它很慢并且会占用大量内存。

有没有更好的方法?如果是这样,我宁愿使用更少的内存而不是性能。

谢谢!

这是我正在使用的:

    NSFileManager *fm = [NSFileManager defaultManager];
    NSMutableArray *files = [[NSMutableArray alloc] init];
    NSString *dp = @"/";
    NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:dp];
    NSString *filePath;
    NSString *fullFilePath;

    BOOL isDir;
    filePath = [dirEnum nextObject];
    while (filePath) {
        @autoreleasepool
        {
            fullFilePath = [dp stringByAppendingPathComponent:filePath];
            [fm fileExistsAtPath:fullFilePath isDirectory:&isDir];
            if (isDir==false) {
                [files addObject:fullFilePath];
            }
            filePath = [dirEnum nextObject];
        }
    }

我也遇到了类似的问题。这是使用 Swift 这些是我开始工作的两个。越长占用的内存越少。

let fileManager:NSFileManager = NSFileManager()
let files = fileManager.enumeratorAtPath("/")
while let file: AnyObject = files?.nextObject() {
if file.hasSuffix("pst") {
self.OutPutText.stringValue += "\(file) \n"
}

第二个例子:

func searchPst(path: String) {
    let files = NSFileManager.defaultManager();
    let dir = files.contentsOfDirectoryAtPath(path, error: nil);
    if dir == nil{
        return
    }
    var isDir : ObjCBool = false
    for file in dir! {
        var file2 = path + (file as! String)
        if path != "/"{
            file2 = path + "/" + (file as! String)
        }
        if files.fileExistsAtPath(file2, isDirectory:&isDir)
        {
            if isDir{
                if path == "/" {
                    searchPst(file2)
                }
                else{
                    if path == "/Volumes"
                    {

                    }
                    else
                    {
                        let file3 = path + "/" + (file as! String)
                        searchPst(file3)
                    }
                }
            }
        }
        if file.hasSuffix("pst") {
            if path == "/"{
                OutPutText.stringValue += path + (file as! String) + "\n"
            }
            else{
                OutPutText.stringValue += path + "/" + (file as! String) + "\n"
            }
        }
    }