@DaHead:
denoch machst du den Vergleich sehr umständlich !
Delphi-Quellcode:
if FSFile1.Size = FSFile2.Size then
begin
while FSFile1.Position < FSFile1.Size do
begin
L1 := FSFile1.Read(B1[1], BlockSize);
L2 := FSFile2.Read(B2[1], BlockSize);
if L1 <> L2 then
Exit;
if not CompareMem(@B1[1], @B2[1], L1) then
Exit;
end;
Result := True;
das geht einfacher mit
result := (FSFile1.Size = FSFile2.Size) and CompareMem(FSFile1.Memory, FSFile2.Memory, FSFile1.Size);
Denn das MMF hat ja schon die komplette Datei in den Speicher virtuell eingeblendet.
Du musst halt nur aufpassen das die beiden Dateien NICHT zu groß sind. Eine 2 Gb Datei wird man eben nicht vollständig in den Speicher einblenden können. Um denoch mit MMF's arbeiten zu können musst du dann aber mit MapViewOfFile() die Startposition + Pagegröße aus der Zieldatei stückchenweise einblenden. Am besten du baust dir eine reine
API-Funktion die über das Windows-
API + MMF's zwei Dateien binär vergleicht, also ohne
VCL.
Schneller ist das weil du immer mehr auf Zwischengepufferte Daten verzichtest, sprich keinerlei Caches und Speicherkopierungen mehr durchgeführt werden. Das
OS lädt nämlich ohne Umwege die Datei in den Speicher.
Aber 3,44 im Verhältnis zu 700 Sekunden hätte ich weis Gott nicht vermutet, da hätte ich Bigg mit seiner Aussage ebenfalls Recht gegeben. Bist du dir sicher das du auch wirklich die kompletten Dateien verglichen hast ? Schiebe mal ein FSFile1.Position := 0; und FSFile2.Position :=0; mit rein, oder benutze gleich meinen obigen Vorschlag.
Ich kanns nämlich auch nicht so recht glauben das die MMF's rund 200x schneller sein sollen.
Gruß Hagen