Seite 1 von 1

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

Verfasst: 20.10.2005 06:14
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

Verfasst: 24.10.2005 15:52
von Tafkadasom2k5
Hey-sehr gut-genau sowas suche ich in meinem nächsten Projekt!
Kewles Teamwork-bisdann
DerMarc :allright: :allright:

Verfasst: 02.03.2006 10:43
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

Verfasst: 05.03.2006 07:27
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