[gelöst] Hash Code von Dateien

4. Juni 2013 08:30

Hallo,
ich suche eine Möglichkeit (möglichst aus NAV direkt) den Hashcode MD5 einer Datei (für Vergleiche ob die Datei schon existiert/geändert wurde) zu ermitteln.
Hat da evtl. jemand Erfahrung mit?

viele Grüße
Thomas
Zuletzt geändert von tba am 4. Juni 2013 16:19, insgesamt 2-mal geändert.

Re: Hash Code von Dateien

4. Juni 2013 08:34

Hallo,

da musst du direkt auf .NET zurückgreifen.

Gruß, Fiddi

Re: Hash Code von Dateien

4. Juni 2013 16:18

ok, das klappt.

Re: [gelöst] Hash Code von Dateien

4. Juni 2013 21:57

Der Vollständigkeit halber ein Beispiel:
Code:
OBJECT Codeunit 50000 Calculate Hash
{
  OBJECT-PROPERTIES
  {
    Date=04.06.13;
    Time=21:49:55;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=VAR
            SHA1Hash@1000000000 : Text;
            MD5Hash@1000000001 : Text;
          BEGIN
            SHA1Hash := GetSHA1('D:\Temp\File1.txt');
            MD5Hash := GetMD5('D:\Temp\File1.txt');

            MESSAGE('SHA1: ' + SHA1Hash + ', MD5: ' + MD5Hash);
          END;

  }
  CODE
  {

    PROCEDURE GetSHA1@1000000004(Filename@1000000000 : Text) : Text;
    VAR
      SHA1CryptoServiceProvider@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Security.Cryptography.SHA1CryptoServiceProvider";
    BEGIN
      SHA1CryptoServiceProvider := SHA1CryptoServiceProvider.SHA1CryptoServiceProvider();
      EXIT(GetHashString(Filename,SHA1CryptoServiceProvider));
    END;

    PROCEDURE GetMD5@1000000000(Filename@1000000000 : Text) : Text;
    VAR
      MD5CryptoServiceProvider@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Security.Cryptography.MD5CryptoServiceProvider";
    BEGIN
      MD5CryptoServiceProvider := MD5CryptoServiceProvider.MD5CryptoServiceProvider();
      EXIT(GetHashString(Filename,MD5CryptoServiceProvider));
    END;

    PROCEDURE GetFileStream@1000000001(Filename@1000000000 : Text;VAR ReturnFileStream@1000000001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.FileStream") : Boolean;
    VAR
      FileMode@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.FileMode";
    BEGIN
      ReturnFileStream := ReturnFileStream.FileStream(Filename,FileMode.Open);

      IF NOT ISNULL(ReturnFileStream) THEN
        EXIT(TRUE);

      EXIT(FALSE);
    END;

    PROCEDURE GetHashString@1000000002(Filename@1000000001 : Text;HashAlgorithm@1000000000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Security.Cryptography.HashAlgorithm") : Text;
    VAR
      FileStream@1000000005 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.FileStream";
      BitConverter@1000000004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.BitConverter";
      HashString@1000000003 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
      ReturnHash@1000000002 : Text;
    BEGIN
      IF NOT GetFileStream(Filename,FileStream) THEN
        EXIT('');

      HashString := BitConverter.ToString(HashAlgorithm.ComputeHash(FileStream));
      ReturnHash := HashString.Replace('-','');
      FileStream.Close();

      EXIT(ReturnHash);
    END;

    BEGIN
    END.
  }
}


Aber Vorsicht vor Exceptions, wie fehlende Dateien!

Re: [gelöst] Hash Code von Dateien

5. Juni 2013 11:16

Hallo Carsten,

da dein Code eleganter aus sieht als meiner, nehme ich deinen :wink:
Hintergrund: ich will 2 aus Navision erzeugte PDF's (saveaspdf) vergleichen ob sie identisch sind.
Da die PDF's aber immer noch einen String /CreationDate [druckdatum/zeit]enthalten muss der vorher noch aus dem Stream entfernt werden.
Falls das mal jemand braucht.

Re: [gelöst] Hash Code von Dateien

3. Februar 2015 09:24

Hallo,

ich muss diesen Alten Thread nochmal ausgraben....

Wenn ich dein Beispeil importieren möchte kommt eine Fehlermeldung das "[" folgen muss.
Ich muss bei den Variablentyp text die Länge angeben [250] damit der Import klappt.

Beim kompelieren kennt er "filemode.open" nicht. Ersetzte ich das durch filemode ist die nächste Meldung

"Der aufruf ist zwischen den folgendenMethoden nicht eindeutig:
ComputeHash(system.IOS.Stream Input Stream
und
ComputeHash(byte[] buffer )


für welche Navisionversion ist das ?

Wir haben 2009 im Einsatz.
Danke
Jörg

Re: [gelöst] Hash Code von Dateien

3. Februar 2015 11:03

Hallo Jörg,

Dynamics NAV 2013+. Siehst du daran, dass für Text keiner Länge angegeben werden muss und mit Enumerations (FileMode) gearbeitet wird.

Re: [gelöst] Hash Code von Dateien

5. Februar 2015 13:15

so was hatte ich schon vermutet......
Danke

Re: [gelöst] Hash Code von Dateien

19. Februar 2015 01:11

[Beitrag aus dem Forum NAV Tipps & Tricks nach NAV 2013 verschoben, da es eine Frage (und kein Tipp oder Trick) darstellt.]

Gruß, Kowa
MSDynamics.de-Team

Re: [gelöst] Hash Code von Dateien

22. Januar 2018 17:10

Hallo zusammen,

ich greife das Thema auch nochmal auf.
Habe zwar schon eine PN an SilverX geschrieben.. hier nochmal an die "Allgemeinheit".

Ich muss, anstatt zweier Dateien, Versionsunterschiede von Tabelleninhalten vergleichen. Sprich, jeder Datensatz in der Tabelle wird einen eigenen MD5-Hash haben. Hintergrund ist, dass bei einer Datenübertragung nicht immer alle Datensätze transferiert werden sollen sondern nur die verschoben werden, welche Unterschiede ggü. der vorherigen Versionen aufweisen.

Vielleicht hat ja hier jemand einen Lösungsansatz.

Re: [gelöst] Hash Code von Dateien

24. Januar 2018 15:04

Um Datensätze zu vergleichen ist nicht unbedingt ein Hash notwendig. Für den Fall, dass du keine Blob-Inhalte prüfen must, reicht ein einfaches
Code:
RecRef1.GETTABLE(Rec1);
RecRef2.GETTABLE(Rec2);

IF FORMAT(RecRef1) <> FORMAT(RecRef2) THEN BEGIN
  [...]
END;
aus.

Re: [gelöst] Hash Code von Dateien

24. Januar 2018 15:59

…bzw. bei großen Sätzen alternativ so.

Re: [gelöst] Hash Code von Dateien

24. Januar 2018 16:22

Oder, wenn man es sicherstellen kann, das mit INSERT(TRUE) bzw. MODIFY(TRUE) gearbeitet wird, dann kann man auch einen DateTime- Feld in die Tabelle einbauen, die im Trigger mit der aktuellen Zeit versehen wird.

Man muss sich dann nur noch den Timestamp des letzten verarbeiteten Datensatzes irgendwo merken, und beim nächsten Lauf nur noch die mit einem neueren Timestamp verarbeiten.

Gruß Fiddi

Re: [gelöst] Hash Code von Dateien

21. April 2020 12:54

Nachtrag:
den Hashcode benutze ich, um nur die Änderung auf ausgewählten Feldern zu vergleichen. Sonst reicht natürlich ein Timestamp.