我正在使用System.Security.Cryptography.SHA512Cng.ComputeHash
來計算一個非常大的文件的SHA-512哈希,我想爲它顯示一個進度條。如何在不重新實現算法的情況下檢查方法的完成?如何顯示文件中另一個庫的操作進度?
3
A
回答
2
您可以繼承Stream
!這裏有一個ProgressStream
從文件中讀取:
Public Class ProgressStream
Inherits FileStream
Public Event ProgressChanged(sender As ProgressStream, progress As Integer)
Public Sub New(fileName As String)
MyBase.New(fileName, FileMode.Open, FileAccess.Read)
End Sub
Public ReadOnly Property Progress() As Integer
Get
Return CInt(Me.Position/Me.Length * 100)
End Get
End Property
Public Overrides Function Read(array() As Byte, offset As Integer, count As Integer) As Integer
Read = MyBase.Read(array, offset, count)
RaiseEvent ProgressChanged(Me, Me.Progress)
End Function
End Class
只是處理ProgressChanged
事件。
同樣的方法適用於所有其他類型的數據流,你也可以用它來作爲所需的所有而不是一次讀取文件的某些其他長時間運行的任務。
2
一種常見的方法是使用TransformBlock
和TransformFinalBlock
並計算以塊的哈希值。這允許你不關心你正在使用的流的類型,或者你想散列多個流(比如說一個目錄中的所有文件)。
這裏有一個小例子:
Using stream As New FileStream("C:\somefile.dat", FileMode.Open),
hash As New SHA512Cng()
Const BUFFER_SIZE As Integer = 2048
Dim buffer(BufferSize - 1) As Byte
Dim bytesRead As Integer
Do
bytesRead = stream.Read(buffer, 0, BUFFER_SIZE)
hash.TransformBlock(buffer, 0, bytesRead, buffer, 0)
Dim percentComplete = stream.Position/stream.Length * 100
'Handle percentComplete here somehow, perhaps with an event
Loop While stream.Length - stream.Position > BUFFER_SIZE
bytesRead = stream.Read(buffer, 0, BUFFER_SIZE) ' read the final block
hash.TransformFinalBlock(buffer, 0, bytesRead)
'We're now 100% complete, raise an event with 100% completion
Dim theHash = hash.Hash 'The final hash values
End Using
較小的緩衝區大小,更細粒度的結果,但可能以性能爲代價。
相關問題
- 1. 如何在數據庫操作的WPF中顯示進度條?
- 2. 如何在昂貴的jquery操作中顯示進度圖標?
- 3. 顯示向量操作的進度
- 4. Django的 - 顯示操作進度
- 5. 顯示進度條的背景操作
- 6. 如何顯示文件上傳進度?
- 7. 如何在PHP中執行和顯示一系列操作的進度?
- 8. 在asyncTask的onPostExecute中顯示另一個進度對話框
- 9. 顯示WIX引導程序安裝操作的進度文本
- 10. 我如何顯示applybatch()與進度條操作?
- 11. 如何在IO操作期間顯示進度
- 12. 從另一個佈局進度條,並在另一個佈局中顯示它
- 13. 啓動並顯示多個同步操作的進度
- 14. 如何在另一個文件中顯示一個xml文件。 XML的另一個XML
- 15. 如何在webview中顯示另一個swf文件,其中顯示一個swf文件?
- 16. 在單個進度條中顯示下載多個文件的進度
- 17. 如何在div中顯示另一個html文件
- 18. 如何使用alamofire上傳多個文件並顯示進度?
- 19. 在python中顯示pool.map操作的進度
- 20. 如何在另一個數據庫中顯示錶的列表?
- 21. 如何在後臺運行一些操作並顯示進度條
- 22. 如何獲得C#中的另一個文件夾文件並顯示在XML
- 23. 文件操作進度對話框
- 24. 如何顯示另一個線程擁有的文件?
- 25. 如何在另一個組件中顯示組件的內容?
- 26. 如何對進度條進行操作
- 27. 發表評論從另一個控制器的顯示操作
- 28. 顯示文件發送的進度
- 29. 如何從一個文本框顯示文本到另一個
- 30. 如何操作Html.ActionLink以顯示到另一個控制器的鏈接?
哎呀,我猜我錯過了。謝謝! – Ryan 2012-08-04 17:14:45