【问题标题】:Update progress bar while iterating file structure迭代文件结构时更新进度条
【发布时间】:2012-10-25 19:55:01
【问题描述】:

我使用这个功能,搜索所选目录中的所有exe文件:

public static IEnumerable<string> GetFiles(string root, string searchPattern)
{
    Stack<string> pending = new Stack<string>();
    pending.Push(root);
    while (pending.Count != 0)
    {
        var path = pending.Pop();
        string[] next = null;
        try
        {
            next = Directory.GetFiles(path, searchPattern);
        }
        catch { }
        if (next != null && next.Length != 0)
            foreach (var file in next) yield return file;
        try
        {
            next = Directory.GetDirectories(path);
            foreach (var subdir in next) pending.Push(subdir);
        }
        catch { }
    }
}

如何根据找到的文件数更新进度条状态?

【问题讨论】:

  • 因为你不知道文件的总数(或者我应该说,除非你知道文件的总数)知道到目前为止你找到了多少并不能告诉你什么 %你是完整的。只需使用选框栏即可。
  • 不,它在 VS 2010 中的标准 windows 窗体应用程序
  • ProgressBar 控件需要一个最大值,这允许它正确增加 UI 值。
  • 如果您使用的是 .NET4+,您应该使用 DirectoryInfo.EnumerateFiles(...) 而不是 Directory.GetFiles(...)。 EnumerateFiles 允许根据需要从中构建文件列表,并且通常性能更高。

标签: c# winforms progress-bar backgroundworker file-search


【解决方案1】:

关键是你不知道你会发现的 exe 文件的总数(也就是 100%),所以基本上你不能渲染进度条!对于这类任务,它更适合沙漏或选框栏...

【讨论】:

    【解决方案2】:

    您可能想要搜索,然后将进度条的最大值设置为找到的文件数。

    您可以分配一个计数器,将值 a = 分配给找到的文件数,然后设置

    progressBar.Maximum = a;

    【讨论】:

    • 他所做的工作只是查找文件。在他全部完成之前,他不会知道最大值是多少。
    • 这需要绕两次,找到所有总文件以获得最大值,然后实际“假装”搜索总文件。他最好的选择是一个带有 # of File Found 标签的选框栏。
    【解决方案3】:

    也许我在这里遗漏了一些东西,但是为什么不将进度条的最大值分配给pending.Count,并在每次处理文件时将进度条的值加 1?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多