Dateien Binär vergleichen

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
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Dateien Binär vergleichen

Beitrag von PAMKKKKK »

Dateien Binär vergleichen
Ich habe im Forum und in André Beer seinem CodeArchiv gesucht....
Gefunden habe ich eine alte Routine (von Sylvia) die sich unter PB 3.93 nicht mehr Kompilieren ließ.
So habe ich eine neue Routine geschrieben.
Die benutzt die neue Memory Library von Deeem2031

Der neue CompareMemory() Befehl vergleicht den Speicher, long-weise. Und wenn ein paar Bytes übrig bleiben werden die extra getestet.
Kopier http://www.deeem2031.de/Memory in den ../Purebasic/PureLibraries-Ordner.

[Edit]
Kiffi hat mich auf folgende Fehler aufmersam gemacht die ich gefixt habe:
Flüchtigkeitsfehler:
[...]
; Datei 2 in den Speicher lesen
*MemoryID2 = AllocateMemory(FS1)
If *MemoryID2 = 0 : ProcedureReturn -1 : EndIf ; Nicht genug Speicher
[...]
ausserdem sollte der Rückgabewert von ReadFile immer ausgewertet werden.
Danke Kiffi
[/Edit]

Code: Alles auswählen

; ------------------------------------------------------------
; Compare File  by Pamkkkkk
; Compares two Files Binary 
; It use the new Memory Library from Deeem2031
; get it under:
; www.deeem2031.de/Memory (Memorylib)
; www.deeem2031.de/Math (Mathlib) 
; PB 3.93 16.Juli 2005
; ------------------------------------------------------------

Procedure.b FileCompare(Pfad1.s,Pfad2.s)
  ;Vergleicht Zwei Dateien Byteweise (Memorylib von deeem2031)
  ; Return 1 = Dateien sind gleich
  ; Return 0 = Dateien sind ungleich
  ; Return -1 = Nicht genug Speicher zum vergleich oder Fehler aufgetreten
  FS1 = FileSize(Pfad1)
  FS2 = FileSize(Pfad2)
  If FS1 <> FS2 : ProcedureReturn 0 : EndIf ; Dateien haben verschiedenen Grössen sind also ungleich
  If FS1 = 0 And FS2 = 0 : ProcedureReturn 1 : EndIf ; 0 Byte Dateien sind immer gleich!
  ; Datei 1 in den Speicher lesen
  *MemoryID1 = AllocateMemory(FS1)
  If *MemoryID1 = 0 :  ProcedureReturn -1 : EndIf ; Nicht genug Speicher
  File1 = ReadFile(#PB_Any, Pfad1)
  If File1 = 0 :  ProcedureReturn -1 : EndIf ; Datei 1 konnte nicht gelesen werden 
  ReadData(*MemoryID1, FS1)
  CloseFile(File1)
  ; Datei 2 in den Speicher lesen
  *MemoryID2 = AllocateMemory(FS1)
  If *MemoryID2 = 0 :  ProcedureReturn -1 : EndIf ; Nicht genug Speicher
  File2 = ReadFile(#PB_Any, Pfad2)
  If File2 = 0 :  ProcedureReturn -1 : EndIf ; Datei 1 konnte nicht gelesen werden 
  ReadData(*MemoryID2, FS1)
  CloseFile(File2)
  ; Dateien vergleichen und Speicher frei geben  
    result.b = CompareMemory(*MemoryID1, *MemoryID2, FS1) ;New Memory Lib from deeem2031 !!!
  FreeMemory(*MemoryID1)
  FreeMemory(*MemoryID2)
  ProcedureReturn result
EndProcedure
Deeem2031 hat auch die Math Library optimiert:
kopier http://www.deeem2031.de/Math in den ../Purebasic/PureLibraries-Ordner.
Zuletzt geändert von PAMKKKKK am 16.07.2005 20:04, insgesamt 1-mal geändert.
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Das ganze würde aber auch mit den alten Libs funktioneren, nur das es bisl langsamer wäre ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten