最近我开始创建一个基于桌面的应用程序,用于扫描 PC。我已经实现了这一点,并且效果很好。但是我想添加一个进度条,以便用户可以知道应用程序已完成扫描的进度量。
我一直致力于将进度条用于已知最小值和最大值的正常功能。但是在扫描过程中,我的最小值为 0,但我如何假设最大值?
我尝试计算特定驱动器内的所有文件,但效率不高,而且几乎没有目录访问权限被拒绝。那么我怎样才能获得扫描的最大值。我怎样才能使进度条适用于这种特殊情况。我见过许多应用程序,一旦流程结束,进度条也处于结束阶段。
最近我开始创建一个基于桌面的应用程序,用于扫描 PC。我已经实现了这一点,并且效果很好。但是我想添加一个进度条,以便用户可以知道应用程序已完成扫描的进度量。
我一直致力于将进度条用于已知最小值和最大值的正常功能。但是在扫描过程中,我的最小值为 0,但我如何假设最大值?
我尝试计算特定驱动器内的所有文件,但效率不高,而且几乎没有目录访问权限被拒绝。那么我怎样才能获得扫描的最大值。我怎样才能使进度条适用于这种特殊情况。我见过许多应用程序,一旦流程结束,进度条也处于结束阶段。
进度条显示任务完成的百分比。您可以使用
Directory.EnumerateFiles(drivePath, "*.mp3", SearchOption.AllDirectories).Count()
这是更轻的重量。
如果您考虑驱动器的总字节数和容量,然后使用刚刚处理的文件的字节大小,您可以显示要处理的字节数的进度。这仅在您仅备份整个磁盘时才有效。
在这里,您有一个使用backgroundworker和progressbar的 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;
}