如何在C#中运行磁盘扫描进程的进度条?

如何在C#中运行磁盘扫描进程的进度条?,c#,.net,progress-bar,C#,.net,Progress Bar,最近,我已经开始创建一个基于桌面的应用程序,用于扫描电脑。我已经实现了这一点,而且效果非常好。但是,我想添加一个进度条,这样用户就可以知道应用程序扫描的进度 我曾经研究过在已知最小值和最大值的正常函数中使用进度条。但在扫描过程中,我的最小值为0,但我如何假设最大值 我试着计算一个特定驱动器中的所有文件,但效率不高,而且很少有被拒绝访问的目录。那么我怎样才能得到扫描的最大值呢。如何使进度条在这种特殊情况下工作。我见过许多应用程序,一旦流程结束,进度条也处于结束阶段。进度条显示任务完成的百分比。您可

最近,我已经开始创建一个基于桌面的应用程序,用于扫描电脑。我已经实现了这一点,而且效果非常好。但是,我想添加一个进度条,这样用户就可以知道应用程序扫描的进度

我曾经研究过在已知最小值和最大值的正常函数中使用进度条。但在扫描过程中,我的最小值为0,但我如何假设最大值


我试着计算一个特定驱动器中的所有文件,但效率不高,而且很少有被拒绝访问的目录。那么我怎样才能得到扫描的最大值呢。如何使进度条在这种特殊情况下工作。我见过许多应用程序,一旦流程结束,进度条也处于结束阶段。

进度条显示任务完成的百分比。您可以使用

Directory.EnumerateFiles(drivePath, "*.mp3", SearchOption.AllDirectories).Count() 
<>这是较轻的重量。

如果你考虑了,然后使用刚才处理的文件的字节大小,就可以显示要处理的字节数的进展。仅当您仅备份整个磁盘时,此功能才起作用

这里有一个WinForms类型的应用程序的更完整的工作示例,该应用程序使用和。没有启动惩罚,因为磁盘大小随时可用

private long diskSizeInGB = 1;
const long GB = 1024 * 1024 * 1024;
long filesizesProcessedInGB = 0;

private void button4_Click(object sender, EventArgs e)
{
    // get drive info
    var cdrive = DriveInfo.GetDrives().First(d => d.Name == @"C:\");
    // calculate max used bytes
    diskSizeInGB = (cdrive.TotalSize - cdrive.TotalFreeSpace) / GB;
    // backupprocess, async!
    bgwScan.RunWorkerAsync();
}

private void bgwScan_DoWork(object sender, DoWorkEventArgs e)
{
    Scanner(@"C:\"); // start scaning/backuping/copying recursively
}

void Scanner(string path)
{
    foreach (var file in Directory.EnumerateFiles(path, "*.*"))
    {
        var fileInfo = new FileInfo(file);
        filesizesProcessedInGB += (fileInfo.Length / GB);  
        // Copy / backup / whatever you want with a file
    }
    // calculate progress percentager and report
    bgwScan.ReportProgress((int)(100 * filesizesProcessedInGB / diskSizeInGB));

    foreach (var dir in Directory.EnumerateDirectories(path))
    {
        try
        {
            Scanner(dir);
        }
        catch (Exception)
        {
            Trace.WriteLine(dir + " error");
        }
    }
}

private void bgwScan_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // update progressbar
    progressBar1.Value = e.ProgressPercentage;
}

我真的弄不到这东西。我遵循了这段代码,它对我来说仍然不能正常工作。现在我可以得到计数,但对我来说仍然需要时间。没有比这更快的了吗?你不想计数,因为tyat不是即时可用的。使用Disksize和filesize,因为Disksize是即时可用的。您根据处理的文件大小计算进度,而不是根据处理的文件数。但im使用的整个过程都是文件处理过程。意味着我必须改变逻辑。或者对于正在处理的每一个文件,我必须采取总数FIZESIZE,然后逐步增加进度条。是的,你必须改变你的逻辑,以考虑文件化,如我的当前样本中所示。你可以打电话给处理部门,我的评论是:
//复制/备份/任何你想要的文件
,非常感谢你的指导。这样做似乎很好。我已经开始了。似乎是比以前更好的解决办法。你能详细说明一下吗?我仍然找不到解决办法。