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

本文关键字:进程 扫描 磁盘 运行 | 更新日期: 2023-09-27 18:31:14

最近我开始创建一个基于桌面的应用程序,用于扫描PC。我已经做到了这一点,而且效果很好。但是,我想添加一个进度条,以便用户可以知道应用程序已完成的扫描进度。

我曾致力于将进度条用于已知最小值和最大值的正常函数。但是在扫描过程中,我的最小值为 0,但我如何假设最大值?

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

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

进度条显示任务完成的百分比。您可以使用以下方法获得最大边界

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;
}