因此,我正在进行简单扫描以获取硬盘驱动器上所有文件夹的列表(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%).像这样继续,直到你到达一个没有子目录的目录,在那里进行处理并增加进度条它代表的任何小数量.
进度条上的每个%都不代表算法完成的相同工作量,但鉴于您的约束,我怀疑您可以做得更好.
如果您需要创建一个进度条而且无法节省收集准确信息所需的时间,那么您将无法创建完美的进度条.考虑到这一假设,您仍然可以创建一个不完全不准确的进度条.
例如,您根据当前目录中的子目录数创建一个细分进度条的函数.因此,如果您的根目录有10个子目录,请将10%的进度条分配给每个目录.然后,进入第一个子目录并计算其子目录.如果它有5,则将前10%的进度条的20%分配给每个进度条(占总进度条的2%).像这样继续,直到你到达一个没有子目录的目录,在那里进行处理并增加进度条它代表的任何小数量.
进度条上的每个%都不代表算法完成的相同工作量,但鉴于您的约束,我怀疑您可以做得更好.