使用进度条快速扫描磁盘以查找文件

时间:2014-03-10 14:06:39

标签: macos cocoa filesystems

我需要在某个文件夹(以及所有子文件夹)中搜索某些文件。这需要尽快完成,我需要能够向用户显示进度指示器。

要显示进度指示器,我需要快速检索,例如,正在搜索的文件夹下面的文件夹总数。这样我可以在扫描子文件夹时对其进行计数,并向用户报告有用的内容。

这些信息可以在某处获得吗?

请注意,此功能专门用于未使用Spotlight编制索引的磁盘。对于Spotlight索引驱动器,我只运行NSMetadataQuery。

2 个答案:

答案 0 :(得分:0)

也许你可以使用NSDirectoryEnumarator吗?

您可以在枚举器上检查您的文件总数,然后在迭代时更新您的进度条。

这是检查所有子文件夹的一小段代码。它已经检查了URL是否是一个目录,所以你可以忽略它。

NSFileManager *fileManager = [[NSFileManager alloc] init] ;
NSArray *keys = [NSArray arrayWithObject:NSURLIsDirectoryKey];
NSString *path = @"YOUR PATH HERE"
NSMutableArray *files = [[NSMutableArray alloc] init];

NSDirectoryEnumerator *enumerator = [fileManager
                                     enumeratorAtURL:[NSURL fileURLWithPath:path]
                                     includingPropertiesForKeys:keys
                                     options:0
                                     errorHandler:^(NSURL *url, NSError *error) {
                                         // Handle the error.
                                         // Return YES if the enumeration should continue after the error.
                                         return YES;
                                     }];

for (NSURL *url in enumerator) {
    NSError *error;
    NSNumber *isDirectory = nil;
    if (! [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) {
        // handle error
        NSLog(@"error-%@", error );
    }
    else if (! [isDirectory boolValue]) {
        //CHECK FOR YOUR FILES ON THIS URL AND UPDATE PROGRESS INDICATOR            
    }
}

答案 1 :(得分:0)

对于实际扫描,您可以使用Cocoa类,例如NSDirectoryEnumerator或更低级别的设施,例如fts - 有多种方法可以选择最适合您的方式。

更有趣的部分是你的进度指标。文件系统不保持文件夹的“子”计数,即所有子,孙子,曾孙等的计数。然而,整个卷上的文件数量是可用的,例如,见statfs

特定文件夹中的项目数量快速且易于确定;例如NSFileManager的{​​{1}}返回一个数组,contentsOfDirectoryAtPath:error:例程返回一个链表,你甚至可以使用硬链接计数 - 可以通过fts获得NSURL。在进入目录时使用此类方法,您可以将其子计数添加到总计,因此在扫描树时,您既保留已处理的项目数,又保留当前已知的需要处理的数量。您的UI可以是“n of m”形式,两者都可以增加。

如果您不喜欢,那么整棵树中的项目数量需要(预)扫描树,这需要一定的时间(您可以在Finder中看到这一点 - 只需选择任何文件夹,更接近到磁盘的根目录越好,并执行获取信息,您将在收集信息时看到暂停。使用上述任何扫描方法进行此操作并不困难。你必须考虑时间/价值/内存权衡 - 例如虽然你可以说生成一个所有树中的项目列表(一个目录枚举器会给你),然后对它进行计数,然后在你有大量内存空间的情况下处理它一个项目在发生任何事情之前暂停 - 就像你在Finder的“获取信息”窗口中看到的暂停一样。)

因此,“快速进度条”的目标是一项挑战。

HTH