如何在散列文件时监视状态
本文关键字:文件 监视状态 | 更新日期: 2023-09-27 18:22:00
我正在构建一个小型应用程序,它可以将任何给定文件的哈希计算为多种类型的哈希算法。
为了简单起见,我将只关注一种处理器密集型算法,即使文件大约为15mb,计算哈希也需要大约半分钟。
我使用BackgroundWorker运行计算(我不确定这是否是正确的计算方法,但我只是在试验)。
现在,我想有一个进度条,它将显示哈希程序,但我不知道如何获得所需的最大值,也不知道将DoStep方法放在哪里。
有什么想法吗?
我的代码:
private void btnBrowse_Click(object sender, EventArgs e)
{
ofdBrowse.Filter = "All Files|*.*";
ofdBrowse.Title = "Open file.";
if (ofdBrowse.ShowDialog() == DialogResult.OK)
{
txtPath.Text = ofdBrowse.FileName;
bwWorker.RunWorkerAsync();
}
}
private void bwWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
t5 = hash.HashSHA512(txtPath.Text);
}
void bwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
txtSHA512.Text = t5;
}
为了能够监控进度,您必须以小增量进行哈希。然后,您将能够计算自己完成的文件的百分比。
这方面的构建块将是HashAlgorithm.TransformBlock
和HashAlgorithm.TransformFinalBlock
。
循环调用TransformBlock
,并使用事件或BackgroundWorker.ReportProgress
向UI传达进度。
这个老问题有一个使用TransformBlock
的好例子,文档中也有一个TransformBlock
的例子。
我建议您不要在DoWork事件中引用UI对象。您应该将代码更正为以下内容:
bwWorker.RunWorkerAsync(ofdBrowser.FileName);
....
void bwWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
string filename = (string)e.Argument;
...
e.Result = hash;
}
void bwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
String hash = (string)e.Result;
...
}
我祝你的小应用程序好运。