.net 如何在文件上显示来自另一个库的操作的进度?

.net 如何在文件上显示来自另一个库的操作的进度?,.net,vb.net,stream,hash,.net,Vb.net,Stream,Hash,我正在使用System.Security.Cryptography.SHA512Cng.ComputeHash计算一个非常大的文件的SHA-512哈希,我想为它显示一个进度条。如何在不重新实现算法的情况下检查方法的完成情况?您可以将流子类化!下面是一个从文件读取的ProgressStream: Public Class ProgressStream Inherits FileStream Public Event ProgressChanged(sender As Progre

我正在使用
System.Security.Cryptography.SHA512Cng.ComputeHash
计算一个非常大的文件的SHA-512哈希,我想为它显示一个进度条。如何在不重新实现算法的情况下检查方法的完成情况?

您可以将
流子类化
!下面是一个从文件读取的
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
事件


相同的方法适用于所有其他类型的流,您也可以将其用于某些其他长时间运行的任务,这些任务根据需要读取文件,而不是一次读取所有文件。

常用的方法是使用
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

缓冲区大小越小,结果越细粒度,但可能会以性能为代价。

Oops,我想我错过了这一点。谢谢