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)
如果您需要创建一个进度条而且无法节省收集准确信息所需的时间,那么您将无法创建完美的进度条.考虑到这一假设,您仍然可以创建一个不完全不准确的进度条.
例如,您根据当前目录中的子目录数创建一个细分进度条的函数.因此,如果您的根目录有10个子目录,请将10%的进度条分配给每个目录.然后,进入第一个子目录并计算其子目录.如果它有5,则将前10%的进度条的20%分配给每个进度条(占总进度条的2%).像这样继续,直到你到达一个没有子目录的目录,在那里进行处理并增加进度条它代表的任何小数量.
进度条上的每个%都不代表算法完成的相同工作量,但鉴于您的约束,我怀疑您可以做得更好.
如果您无法递归目录结构,因为这将花费与执行任务一样长的时间,那么您能做的最好的事情就是猜测有多少个文件夹。严重地。
也许您可以使用基于过去历史记录的算法(例如,上次我这样做时,总共有 150 个目录,而有 10 个顶级目录,因此一个好的猜测是当前顶级目录数量的 15 倍) 。
告诉用户某件事需要一段时间(不知道具体需要多长时间)的另一种方法是使用倒计时器。即使您猜测某件事将花费比实际更长的时间(假设 5 分钟,而实际上是 3 分钟的任务),至少用户知道大概需要多长时间。当事情比他们被告知的完成得更快时,他们会更高兴。当然,唯一令人遗憾的是,如果你在另一边猜错了,即某件事花费的时间比你想象的要长。然后他们坐在那里等待(在他们看来)应该已经完成的事情完成。
归档时间: |
|
查看次数: |
900 次 |
最近记录: |