当前位置:  开发笔记 > 开发工具 > 正文

扫描硬盘时的ProgressBar

如何解决《扫描硬盘时的ProgressBar》经验,为你挑选了1个好方法。

因此,我正在进行简单扫描以获取硬盘驱动器上所有文件夹的列表(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:\\");
    }
}

Welbog.. 8

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

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

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



1> Welbog..:

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

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

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

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有