2012-01-29 49 views
2

我正在構建一個小應用程序,用於計算從任何給定文件到多種哈希算法的哈希值。如何在散列文件時監視狀態?

爲了簡單起見,我只關注處理器密集型的一種算法,即使文件大約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; 
} 

回答

5

爲了能夠監控進度,你將不得不做散在小的增量。然後,您將能夠計算完成自己的文件的百分比。

爲此的構建塊將是HashAlgorithm.TransformBlockHashAlgorithm.TransformFinalBlock

在循環中調用TransformBlock,並使用事件或BackgroundWorker.ReportProgress將進度傳達給UI。

這個older question has an answer有一個使用TransformBlock的好例子,在TransformBlock的文檔中也有一個例子。

+0

好的,我會做一些閱讀。謝謝。 – HelpNeeder 2012-01-29 10:42:28

+1

我添加了一個例子的鏈接。 – driis 2012-01-29 10:45:39

+0

.....完美:D – HelpNeeder 2012-01-29 10:46:41

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 2012-01-29 10:55:59