Как сгенерировать md5-хэши для больших файлов с VBA?
У меня есть следующие функции для генерации md5-хэшей для файлов. Функции отлично работают для небольших файлов, но вылетает и генерируетОшибка выполнения 7 - Недостаточно памяти когда я пытаюсь хэшировать файлы размером более ~ 250 МБ (на самом деле я не знаю, в каком именно размере он разбивается, но файлы размером менее 200 МБ работают нормально).
Я не понимаю, почему он ломается в определенном размере, поэтому, если бы кто-то мог пролить свет на это, я был бы очень признателен.
Кроме того, что я могу сделать, чтобы функции обрабатывали большие файлы? Я намерен использовать функции в более крупном инструменте, где мне нужно будет генерировать хэши для файлов неизвестных размеров. Большинство из них будет достаточно маленьким, чтобы работали текущие функции, но мне также придется обрабатывать большие файлы.
Я получил свои текущие функции от наиболее проголосовавших ответ на этот постКак получить шестнадцатеричный хеш MD5 для файла с использованием VBA?
Public Function FileToMD5Hex(ByVal strFileName As String) As String
Dim varEnc As Variant
Dim varBytes As Variant
Dim strOut As String
Dim intPos As Integer
Set varEnc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
'Convert the string to a byte array and hash it
varBytes = GetFileBytes(strFileName)
varBytes = varEnc.ComputeHash_2((varBytes))
'Convert the byte array to a hex string
For intPos = 1 To LenB(varBytes)
strOut = strOut & LCase(Right("0" & Hex(AscB(MidB(varBytes, intPos, 1))), 2))
Next
FileToMD5Hex = strOut
Set varEnc = Nothing
End Function
Private Function GetFileBytes(ByVal strPath As String) As Byte()
Dim lngFileNum As Long
Dim bytRtnVal() As Byte
lngFileNum = FreeFile
'If file exists, get number of bytes
If LenB(Dir(strPath)) Then
Open strPath For Binary Access Read As lngFileNum
ReDim bytRtnVal(LOF(lngFileNum)) As Byte
Get lngFileNum, , bytRtnVal
Close lngFileNum
Else
MsgBox "Filen finns inte" & vbCrLf & "Avbryter", vbCritical, "Filen hittades inte"
Exit Function
End If
GetFileBytes = bytRtnVal
Erase bytRtnVal
End Function
Спасибо