Entwickler-Ecke

Dateizugriff - Schnelle lösung fürs vergleichn von dateien gesucht


mimi - Mi 22.10.03 17:52
Titel: Schnelle lösung fürs vergleichn von dateien gesucht
Hallo,
ich suche eine schnelle lösung fürs vergleichen von merhen dateien(über ca 3000 stück).
was wir lösungen haben ich dafür ?


toms - Mi 22.10.03 18:00

Hi!

Z.B TFileStream & CompareMem:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
function FilesAreEqual(const File1, File2: TFileName): Boolean;
const
  BlockSize = 65536;
var
  fs1, fs2: TFileStream;
  L1, L2: Integer;
  B1, B2: array[1..BlockSize] of Byte;
begin
  Result := False;   
  fs1 := TFileStream.Create(File1, fmOpenRead or fmShareDenyWrite);
  try     
    fs2 := TFileStream.Create(File2, fmOpenRead or fmShareDenyWrite);
    try       
      if fs1.Size = fs2.Size then
      begin
        while fs1.Position < fs1.Size do
        begin
          L1 := fs1.Read(B1[1], BlockSize);
          L2 := fs2.Read(B2[1], BlockSize);
          if L1 <> L2 then
          begin
            Exit;
          end;
          if not CompareMem(@B1[1], @B2[1], L1) then Exit;
        end;
        Result := True;
      end;
    finally
      fs2.Free;
    end;
  finally
    fs1.Free;
  end;
end;


mimi - Mi 22.10.03 18:13

danke werde ich testen


scrooge - Fr 24.10.03 12:08

Wenns sehr große Dateien sind, würde ich viellleicht TReader verwendedn !


Klabautermann - Fr 24.10.03 13:43

Hallo,

desweiteren solltest du nur Dateien vergleichen die auch gleich sein können, wen z.B. 2 Dateien eine unterscheidliche Dateigröße haben ist ein weiterer vergleich nicht sinvoll.

Gruß
Klabautermann

PS: Wenn du wirklich jede mit jeder vergleichen musst, dann solltest du nach möglichst vielen Techniken suchen, die dich um den Komplett vergleich umhin bringen.


maximus - Fr 24.10.03 14:57

scrooge hat folgendes geschrieben:
Wenns sehr große Dateien sind, würde ich viellleicht TReader verwendedn !


Das musst du mir erklären? ...TReader ist ein teil des delphi-streaming system, zum lesen von strukturierten formaten!...aber auf die struktur kommt es doch bei einem vergleich garnicht an.

cu,

PS: evtl. kann man es mit hash-codes machen. Von beiden dateien einen Hash erstellen und dann nur den hash vergleichen...oder?


Anonymous - Fr 24.10.03 18:11

Dummerweise sind Hashes nicht eindeutig.
Du könntest zuerst die Dateilänge vergleichen und dann solange suchen bis du (k)einen Unterschied findest.


mimi - Fr 24.10.03 18:25

gibs nicht noch schnellere möglichkeiten ?
weil wenn ich über ca. 3000 dateien öffnen muss kann es zimlich lange dauern. wenn ich die jetzt für byte für byte auslesen soll.


Anonymous - Fr 24.10.03 18:28

Den Inhalt der Daten kannst du ja schlecht erraten. Also ums öffnen wirst du nicht herum kommen.


mimi - Fr 24.10.03 18:33

ne darum nicht, aber ich habe davon gehöert, das man irgenwie eine summe bilden köntne oder sowas. oder vileicht hat ja auch jede datei eine eindeutiege nummer dann wäres noch einfacher.


Anonymous - Fr 24.10.03 18:40

Wenn du eine Eindeutige Nummer willst, ist die immer genau so groß wie die Datei, es sei denn du komprimierst sie.

Du kannst einen Hash bilden (Suche in: Delphi-Forum, Delphi-Library MD5), aber die Datei wird trotzdem geöffnet. Ich weiß nicht was schneller ist.


thebe - Fr 24.10.03 18:40

Checksummen werden auch durchs Öffnen der Datei generiert. Die kann man der Datei leider nit anner Nasenspitze ablesen..


mimi - Fr 24.10.03 19:43

auf Checksummen wollte ich raußs wie funktioniert das genau ? was muss ich dabei beachten ?


Anonymous - Fr 24.10.03 19:44

habe ich zwar oben schon mal geschrieben, aber

Suche in: Delphi-Forum, Delphi-Library MD5

da wirst du auch noch andere Verfahren miterwischen.


mimi - Fr 24.10.03 19:47

danke werde ich morgen mal anschauen.
jetzt muss ich ins bett :(


scrooge - Sa 25.10.03 17:52

@Maximus: Schon, aber TReader hat auch die Proc FlushBuffer, wie TWriter. Dachte nur, dass es vielleicht einen ähnlichen Performance-Vorteil haben könnte.


mimi - Sa 25.10.03 18:14

das hat es leider nicht im gegenteiel:
es ist soga langsammer als wenn man TFileStream gleich nutzt.
aber das sollte man nicht merken *G*