AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte .: CheckIt! :.
Thema durchsuchen
Ansicht
Themen-Optionen

.: CheckIt! :.

Ein Thema von Chrissi91 · begonnen am 21. Dez 2005 · letzter Beitrag vom 23. Dez 2005
Antwort Antwort
Seite 2 von 4     12 34      
Chrissi91
Registriert seit: 28. Jul 2005
Name: .: CheckIt! :.

Version: 1.3

Beschreibung: Tool zum vergleichen 2er Dateien.

Hallo ,

ich habe eute mal ein kleines Tool programmiert, das es eröglicht, 2 Dateien zu vergleichen. Es ist sehr simpel und war eher ein Langeweilevertreib . Beim Fehlerreport muss ich mir noch etwas einfallen lassen, da das niemand verstehen wird, auch ich nicht. ^^ Über Vorschläge freue ich mich und über Kritik ebenfalls.
Angehängte Grafiken
Dateityp: bmp screenshot-xp_146.bmp (219,0 KB, 129x aufgerufen)
Dateityp: bmp screenshot-st_153.bmp (238,9 KB, 83x aufgerufen)
Angehängte Dateien
Dateityp: rar checkit__xp_181.rar (209,3 KB, 21x aufgerufen)
Dateityp: rar checkit__st_109.rar (197,4 KB, 8x aufgerufen)
 
Benutzerbild von malo
malo
 
#11
  Alt 21. Dez 2005, 17:14
Du musst doch nur Hagens Unit in dein Programm einbinden, und die Funktion "CompareFile" aufrufen. Gibt es da etwas nicht zu verstehen?
  Mit Zitat antworten Zitat
ichbins

 
Delphi 2005 Personal
 
#12
  Alt 21. Dez 2005, 17:32
Aber der md5- bzw. crc32-Vergleich ist NIE ganz sicher, da er nur den Hash der Datei einliest.

Lies die Datei am besten in 4096-Byte-Blöcken ein und vergleiche diese dann auf einen Schwung. Wenn Unterschiede auftreten kannst du diese per XOR feststellen.

Delphi-Quellcode:
var
  f1,f2:file of byte;
  buf1,buf2,diff:array[1..4096] of byte;
  read,i:integer;
begin
  ...
  while (not eof(f1)) and (not eof(f2)) do
  begin
    fillchar(buf1,4096,#0);
    fillchar(buf2,4096,#0);
    blockread(f1,buf1,4096,x);
    blockread(f2,buf2,x);
    if buf1<>buf2 then
      //wie heisst nochmal der Befehl für Schleife fortsetzen :gruebel: //fällt mir jetzt nicht ein, also mach ichs anders.
    begin
      diff:=buf1 xor buf2;
      for i:=1 to 4096 do
        if diff[i]>0 then
          inc(differents);
    end;
end;

Wenn der Test fertig ist, kriege ich angezeigt: es gibt xxx Unterschiede. Weiteres entnehmen sie dem Errorlog.

Was für ein Errorlog
Michael Enßlin
  Mit Zitat antworten Zitat
Tubos

 
Delphi 7 Personal
 
#13
  Alt 21. Dez 2005, 17:56
Zitat:
Aber der md5- bzw. crc32-Vergleich ist NIE ganz sicher, da er nur den Hash der Datei einliest.
Hash-Algorithmen sind für sowas sicher genug
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead
 
#14
  Alt 21. Dez 2005, 18:06
das wurde zwar alles schon mal diskutiert aber:

erst
vergleichst du die dateigröße. wenn du zwei identische hast, dann
vergleichst du die erstellte checksumme der zwei dateien. wenn du zwei identische hast, dann
vergleichst du die beiden dateien byte für byte. wenn du zwei identische hast,
sind es auf jeden fall doppelte (sprich gleiche) dateien.

sinn dieser reihenfolge ist, dass du nicht sinnlos alle dateien mit allen dateien vergleichst.

als schneller hash empfiehlt sich md4, md5 und bei größeren dateien sha1.
  Mit Zitat antworten Zitat
ichbins

 
Delphi 2005 Personal
 
#15
  Alt 21. Dez 2005, 18:12
Aber die Checksumme zu erstellen dauert auch einige Zeit. Dazu muss auch die ganze Datei gelesen und verrechnet werden. Wieso also nicht gleich einen großen Vergleich machen?
Michael Enßlin
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead
 
#16
  Alt 21. Dez 2005, 18:14
ich bin kein fachmann für checksummen, aber soweit ich weiß, wird bei einer checksummen-erstellung NICHT die ganze datei eingelesen.

warum sollte sonst das erstellen einer checksumme zig-fach schneller sein, als der byte-per-byte vergleich einer sagen wir mal +4gb datei?

daher sind checksummen auch NICHT immer eindeutig.

edit: hier wurde alles erklärt.
  Mit Zitat antworten Zitat
Tubos

 
Delphi 7 Personal
 
#17
  Alt 21. Dez 2005, 18:17
Es wird bestimmt die ganze Datei eingelesen, andernfalls könnte es sein dass ein Unterschied von ein paar Byte einen gleichen Hash ergibt - der Sinn von Hashfunktionen ist es, genau das zu verhindern!
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead
 
#18
  Alt 21. Dez 2005, 18:22
wenn zwei dateien eine unterschiedliche Checksumme haben, sind sie definitiv unterschiedlich.

wenn sie den gleichen haben, ist allerdings nicht unbedingt das Gegenteil der Fall.
  Mit Zitat antworten Zitat
Tubos

 
Delphi 7 Personal
 
#19
  Alt 21. Dez 2005, 18:34
Zitat:
wenn sie den gleichen hash haben, ist allerdings nicht unbedingt das Gegenteil der Fall.
Aber mit an Sicherheit grenzender Wahrscheinlichkeit
Lukas
  Mit Zitat antworten Zitat
ichbins

 
Delphi 2005 Personal
 
#20
  Alt 21. Dez 2005, 18:44
Wenn aber sowieso die ganze Datei eingelesen wird kann man doch mit genauso hohem Tempo gleich eine Komplettprüfung vollziehen.

Du machst ja auch nicht beim Bestimmen ob eine Zahl eine Primzahl ist zuerst einen vielleicht-nicht-Primzahltext und testest erst dann, ob es eine Primzahl ist, wenn beide Tests dieselbe Dauer haben
Michael Enßlin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz