2012-01-29 9 views
2

私は、任意のファイルから複数のタイプのハッシュアルゴリズムにハッシュを計算する小さなアプリケーションを構築しています。ファイルのハッシュ中に状態を監視する方法はありますか?

簡潔にするために、私はプロセッサ集中型である1つのアルゴリズムのみに焦点を当て、ファイルが約15MBであっても、ハッシュを計算するのに約0.5分かかります。

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

答えて

5

進行状況を監視できるようにするために、あなたは少しずつハッシュを行う必要があります。あなたは自分自身で行われたファイルのパーセンテージを計算することができます。

ビルディングブロックは、HashAlgorithm.TransformBlockHashAlgorithm.TransformFinalBlockです。

ループでTransformBlockを呼び出し、イベントを使用するか、BackgroundWorker.ReportProgressを使用してUIに進捗状況を伝えます。

このolder question has an answerは、TransformBlockを使用する良い例であり、TransformBlockのドキュメントにも例があります。

+0

よろしくお願いいたします。ありがとう。 – HelpNeeder

+1

例へのリンクを追加しました。 – driis

+0

.....完璧:D – HelpNeeder

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

あなたの小さなアプリで幸運を祈ってください。

+0

これは良い点です。そして、ありがとう、いくつかの運が必要になります:) – HelpNeeder

関連する問題