C# 迭代文件结构时更新进度条

C# 迭代文件结构时更新进度条,c#,winforms,progress-bar,backgroundworker,file-search,C#,Winforms,Progress Bar,Backgroundworker,File Search,我使用此功能搜索所选目录中的所有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 =

我使用此功能搜索所选目录中的所有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 { }
    }
}
公共静态IEnumerable GetFiles(字符串根,字符串搜索模式)
{
堆栈挂起=新堆栈();
挂起。推送(根);
while(pending.Count!=0)
{
var path=pending.Pop();
字符串[]next=null;
尝试
{
next=Directory.GetFiles(路径、搜索模式);
}
捕获{}
if(next!=null&&next.Length!=0)
foreach(下一个中的var文件)生成返回文件;
尝试
{
next=Directory.GetDirectories(路径);
foreach(下一步中的var subdir)挂起。Push(subdir);
}
捕获{}
}
}

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

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

您可以指定一个计数器,该计数器将值a=指定给找到并设置的文件的#


最大值=a

也许我这里遗漏了什么,但是为什么不将进度条的最大值指定给
挂起。每次处理文件时,计数
,并在进度条的值中添加1?

关键是,您不知道将找到的exe文件的总数(即100%),因此基本上无法呈现进度条!对于这类任务,它更适合沙漏或选框条…

因为你不知道文件总数(或者我应该说,除非你知道文件总数),知道到目前为止找到了多少文件并不能告诉你完成了多少。只需使用选框栏。否,VS 2010中的标准windows窗体应用程序ProgressBar控件需要最大值,这允许它正确增加UI值。如果您使用的是.NET4+,则应使用DirectoryInfo.EnumerateFiles(…)而不是Directory.GetFiles(…)。EnumerateFiles允许根据您的需要构建文件列表,并且通常性能更高。他所做的工作只是查找文件。在他完成之前,他不知道最大值是多少。这需要绕两圈,找到所有的总文件以获得最大值,然后实际“假装”搜索总文件。他最好的选择是一个有“找到文件”标签的选框酒吧。