Funktion kommt mit großen Dateien nicht klar

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Funktion kommt mit großen Dateien nicht klar

    Moin Zusammen,

    ich habe eine Funktion von einem Kollegen erhalten, die mir den Richtigen Hash für die Datei ausgibt, nur leider kommt die Funktion nicht mit großen Dateien klar und mir ist auch nicht vollständig ersichtlich wie der Hash in dieser Funktion berechnet wird.
    der Kollege von dem ich diese habe, hat sie auch nur damals irgendwo gefunden und kann mir daher leider auch nicht viel helfen.

    was könnte ich tun, damit die Funktion mit größeren Dateien klar kommt?

    Code:

    VB.NET-Quellcode

    1. Private Async Function Hash(ByVal filepath As String) As Task(Of String)
    2. Dim arr As Byte() = File.ReadAllBytes(filepath)
    3. Dim bytes As Byte() = Encoding.UTF8.GetBytes(Path.GetFileNameWithoutExtension(filepath))
    4. Array.Resize(arr, arr.Length + bytes.Length)
    5. Array.Copy(bytes, 0, arr, arr.Length - bytes.Length, bytes.Length)
    6. Return String.Join(String.Empty, New MD5Cng().ComputeHash(arr).Select(Function(x) x.ToString("x2")))
    7. End Function


    Danke im voraus.

    Hallo,
    in dem du die Funktion so änderst, dass nicht die gesamte Datei in den Speicher geladen wird, sondern du mit nem Stream arbeitest. Beispiel

    C#-Quellcode

    1. ​const string filePath = @"C:\Pfad\zur\Datei.txt";
    2. using var md5 = System.Security.Cryptography.MD5.Create();
    3. using FileStream fs = File.OpenRead(filePath);
    4. byte[] hashBuffer = md5.ComputeHash(fs);
    Scheint vom Verlauf einfach: »Nimm Dateiinhalt und Dateinamen, von beiden jeweils die Byteversion zusammen in ein ByteArray und dann mit MD5Cng().ComputeHash den Hashwert berechnen und als Binärwerttext zurückgeben.« Schau Dir die Hash-Funktion an, da stehen bestimmt Einschränkungen drin.

    ##########

    Der Lösungsvorschlag von ISliceUrPanties klingt ziemlich überzeugend.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke hat geklappt

    VB.NET-Quellcode

    1. Private Async Function ReadAllBytesAsync(filePath As String) As Task(Of Byte())
    2. Using fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize:=1024, useAsync:=True)
    3. Dim length As Integer = CInt(fileStream.Length)
    4. Dim buffer As Byte() = New Byte(length - 1) {}
    5. Await fileStream.ReadAsync(buffer, 0, length)
    6. Return buffer
    7. End Using
    8. End Function

    Brauchst Du tatsächlich das komplette Bytearray?
    Wenn Du nur den Hash berechnen willst, nutze den Code aus Post #2.
    Den nutze ich, um Dubletten von Dateien zu finden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!