CRC32FileFingerprint() - (Windows, Linux & MacOS X)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

CRC32FileFingerprint() - (Windows, Linux & MacOS X)

Beitrag von nco2k »

hab grad auf die schnelle eine CRC32FileFingerprint() prozedur geschrieben. vielleicht ist es für den einen oder andern nützlich:

Code: Alles auswählen

Procedure.s CRC32FileFingerprint(FileName.s)
  Result.s = ""
  FileSize.l = FileSize(FileName)
  If FileSize > 0
    File.l = ReadFile(#PB_Any, FileName)
    If File
      *Memory.l = AllocateMemory(FileSize)
      If *Memory
        UseFile(File)
        Total.l = ReadData(*Memory, FileSize)
        If Total = FileSize
          Result = Hex(CRC32Fingerprint(*Memory, FileSize))
        EndIf
        FreeMemory(*Memory)
      EndIf
      CloseFile(File)
    EndIf
  ElseIf FileSize = 0
    Result = "00000000"
  EndIf
  ProcedureReturn Result
EndProcedure

FileName.s = "c:\test.txt"
CRC32.s = CRC32FileFingerprint(FileName)
If CRC32
  MessageRequester("CRC32", "CRC32-FileFingerprint of "+FileName+" is: "+CRC32)
Else
  MessageRequester("CRC32", "Could not check CRC32-FileFingerprint of "+FileName)
EndIf

End
c ya,
nco2k
Zuletzt geändert von nco2k am 21.12.2005 16:27, insgesamt 2-mal geändert.
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Hey-sehr gut-genau sowas suche ich in meinem nächsten Projekt!
Kewles Teamwork-bisdann
DerMarc :allright: :allright:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

Hier eine etwas schnellere Variante mit API. Die Procedure war ursprünglich mal die "FastFileMD5" aus der FastFile Lib von Rings - hab die also nur auf CRC32 umgeändert (Danke Rings!).
Allerdings gibt diese Version keinen Hex String aus sondern den normalen CRC32-Wert. Wer Hex braucht - naja... das weiss wohl jeder selber :)

Code: Alles auswählen

Procedure CRC32FileFingerprint (Filename.s) ;build a CRC32 Checksum over the file
  Handle=CreateFile_(Filename,-2147483648,3,0,3,128,0) ;first open the file for reading only
  If Handle
    length=GetFileSize_(Handle,0) ;Get length of file
    If length>0
      MapHandle=CreateFileMapping_(Handle,0,2,0,length,0)
      If MapHandle
        ViewHandle=MapViewOfFile_(MapHandle,4,0,0,0)
        If ViewHandle
          res = CRC32Fingerprint(ViewHandle,length)
          UnmapViewOfFile_(ViewHandle)
        EndIf
        CloseHandle_(MapHandle)  ;okay, now close the Maphandle
      EndIf
    EndIf
    CloseHandle_(Handle);okay, now close the Filehandle
  EndIf
  ProcedureReturn res
EndProcedure
PS.: Läuft natürlich nur unter WIN
tranquil
Beiträge: 117
Registriert: 22.09.2004 22:07
Kontaktdaten:

Beitrag von tranquil »

Der Sinn und Zweck eines Befehls wie "CRC32FileFingerprint" sollte es sein, nicht das Komplette File in den Speicher laden zu müssen.

Besser wäre eine Lösung wo immer nur Teile des Files geladen werden und dann in die CRC Berechnung einfließen. Die Berechnung einer Videodatei z.B. mit 2 Gig Datenvolumen ist mit diesen beiden Prozeduren gänzlich unkomfortabel.

Grüße

Mike
Antworten