扫描硬盘时的ProgressBar

Bri*_*ian 5 directory file progress-bar

因此,我正在进行简单扫描以获取硬盘驱动器上所有文件夹的列表(c:\ windows和c:\ windows\system32被视为单独的条目).如果我想为这1-2分钟的任务提供进度条,我该怎么办呢?也就是说,我知道如何制作进度条,但不知道如何确定完成了多少工作.

编辑:请注意,执行预扫描不是一种解决方案,因为此扫描只获取文件夹列表,而预扫描只需要一段时间.

代码示例如下.在我的系统上运行干净需要不到2分钟,但由于磁盘访问缓存,第二次运行时间不到10秒.我已经创建了基于堆栈而不是基于递归的变体.

我发现的一种机制可能不是100%可靠,但比我的扫描快得多,将"dir/s/ab/b"传递给我的程序并计算换行的实例.Dir做的某种魔术可以比我的程序更好地扫描我的HD,但我不知道那是什么魔法.

class Program
{
    static void recurse(string pos)
    {
        DirectoryInfo f = new DirectoryInfo(pos);
        try
        {
            foreach (DirectoryInfo x in f.GetDirectories("*"))
            {
                recurse(x.FullName);
            }
        } catch (Exception) {}
    }
    static void Main(string[] args)
    {
        recurse("c:\\");
    }
}
Run Code Online (Sandbox Code Playgroud)

Wel*_*bog 8

如果您需要创建一个进度条而且无法节省收集准确信息所需的时间,那么您将无法创建完美的进度条.考虑到这一假设,您仍然可以创建一个不完全不准确的进度条.

例如,您根据当前目录中的子目录数创建一个细分进度条的函数.因此,如果您的根目录有10个子目录,请将10%的进度条分配给每个目录.然后,进入第一个子目录并计算其子目录.如果它有5,则将前10%的进度条的20%分配给每个进度条(占总进度条的2%).像这样继续,直到你到达一个没有子目录的目录,在那里进行处理并增加进度条它代表的任何小数量.

进度条上的每个%都不代表算法完成的相同工作量,但鉴于您的约束,我怀疑您可以做得更好.


Mic*_*odd 0

如果您无法递归目录结构,因为这将花费与执行任务一样长的时间,那么您能做的最好的事情就是猜测有多少个文件夹。严重地。

也许您可以使用基于过去历史记录的算法(例如,上次我这样做时,总共有 150 个目录,而有 10 个顶级目录,因此一个好的猜测是当前顶级目录数量的 15 倍) 。

告诉用户某件事需要一段时间(不知道具体需要多长时间)的另一种方法是使用倒计时器。即使您猜测某件事将花费比实际更长的时间(假设 5 分钟,而实际上是 3 分钟的任务),至少用户知道大概需要多长时间。当事情比他们被告知的完成得更快时,他们会更高兴。当然,唯一令人遗憾的是,如果你在另一边猜错了,即某件事花费的时间比你想象的要长。然后他们坐在那里等待(在他们看来)应该已经完成​​的事情完成。