4

这个问题提供了一种使用kernel.dll递归查找文件属性(例如文件名)的快速方法。问题是报告进度(例如在 Windows 窗体应用程序中)仅限于它当前所在的文件或目录,因为它没有关于预先总文件数的信息。

不过,我知道在 Windows 7 中,如果您使用文件资源管理器搜索文件,它会显示搜索进度条:

在此处输入图像描述

那么他们在这里是怎么做到的呢?此处是否提前知道总文件数?是否可以在上面链接的问题的答案中模仿这种进度报告?如果没有预先的总文件数,我不确定如何做到这一点。

我能找到的最接近的问题是这个递归方法似乎有一些问题,因为我没有预先计算文件夹数量,而且对于包含许多文件的单个目录来说,这种行为会非常奇怪。

4

2 回答 2

5

根据您需要获得的准确度,可能有一个简单的两遍解决方案(对于网络驱动器不是最佳的,因此您可能需要在那里进行调整)。

对于第一n级目录(比如 4 个,包括驱动器),计算子目录的数量。这通常是一个快速操作,尽管您可以将其调整为仅在存在超过 5 个子目录或类似的子目录时才递归。存储此号码。

当您执行真正的搜索时,请跟踪您已完成n的在根步骤内的子目录的数量。使用此数字和存储的计数来估计完成情况。

例如,具有基本结构:

C:\
    a\
        1\
            i\
            ii\
            iii\
        2\
        3\
    b\
    c\

计数a1,忽略i和兄弟姐妹,计数2等。然后,在搜索时,当您完成搜索321a等时增加条形。

现在,这绝对不是万无一失的。可能存在竞争条件,它不是非常准确,以及各种各样的其他事情。

然而,对于一个低粒度的进度条,它足够接近以至于看起来非常准确。更重要的是,从用户体验的角度来看,使用存储的计数并将进度与之进行比较往往会阻止进度条在过程中途增长。

我实际上在这里的一些代码中使用了这种技术。

最初的构建,下降了 10 个级别,仍然非常快。我不记得它进行了多少测试,但是在搜索 2.5-3 百万个文件时,该栏明显准确,没有很多停顿(尽管只提前检查了 1/1000)。请注意,进度条越短,显示的越准确。;)

于 2012-08-20T18:32:08.280 回答
1

在后台启动一个线程,计算您正在搜索的目录下的文件。在后台,更新到目前为止统计的文件数。在进度条中使用此计数。一旦此计数大于 1,就可以安全地开始搜索。在计算进度时,如果您的搜索(奇迹般地)超过了您的后台文件计数器,或者如果进度条中偶尔可见的离题是不可接受的,请捏造结果。

这样就剩下找出计算文件的最快方法(考虑 FindFirstFileEx)。在本地驱动器上,可能需要 2 或 3 秒来计算像 Program Files 这样的文件夹。通过网络,它会花费更长的时间,因为使用 FindFirstFileEx,当您只需要文件计数和目录列表时,文件名会被传输。

这一切都假定您将花费更多时间在搜索上,而不仅仅是计算文件。

于 2012-08-20T18:22:17.433 回答