如何在散列文件时监控状态?

时间:2012-01-29 10:37:00

标签: c# progress-bar backgroundworker status

我正在构建一个小应用程序,用于计算从任何给定文件到多种类型的哈希算法的哈希值。

为简单起见,我将只关注处理器密集型的1个算法,即使文件大约为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;
}

2 个答案:

答案 0 :(得分:6)

为了能够监控进度,您必须以小增量进行哈希。然后,您将能够计算完成自己的文件的百分比。

此构建基块为HashAlgorithm.TransformBlockHashAlgorithm.TransformFinalBlock

在循环中调用TransformBlock,并使用事件或BackgroundWorker.ReportProgress将进度传达给用户界面。

这个older question has an answer有一个使用TransformBlock的好例子,TransformBlock的文档中也有一个例子。

答案 1 :(得分:3)

我建议您不要在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;
    ...
}

祝你的小应用程序好运。