Delphi-PRAXiS
Seite 4 von 12   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eindeutiger Vergleich für große Dateien gesucht (https://www.delphipraxis.net/50896-eindeutiger-vergleich-fuer-grosse-dateien-gesucht.html)

dahead 2. Aug 2005 23:44

Re: Eindeutiger Vergleich für große Dateien gesucht
 
ups. fehler.

bigg 2. Aug 2005 23:48

Re: Eindeutiger Vergleich für große Dateien gesucht
 
Moin,

ich führe noch vor dem vollständigen Scan einen schnellen Scan durch.
Dabei lese ich die ersten 2 KB ein und bilde wiederum eine Prüfsumme, kommt es zu doppelten Summen überrpüfe ich die gesamte Datei.

dahead 2. Aug 2005 23:56

Re: Eindeutiger Vergleich für große Dateien gesucht
 
hallo,

ja, das ist klar. allerdings prüfst du doch die komplette datei, indem du von der kompletten datei eine checksumme erstellst. aber wie hier in diesem thread ja festgestellt wurde, ist das nicht 100%ig eindeutig.

oder ist es schon zu spät für mich?

bigg 2. Aug 2005 23:59

Re: Eindeutiger Vergleich für große Dateien gesucht
 
moin,

auch der komplette Scan stellt nicht sicher, das die Dateien identisch sind. :zwinker:

dahead 3. Aug 2005 00:00

Re: Eindeutiger Vergleich für große Dateien gesucht
 
ja, genau das meine ich doch.

also prüfst du in deinem programm nicht byte per byte, oder?

bigg 3. Aug 2005 00:02

Re: Eindeutiger Vergleich für große Dateien gesucht
 
Byte für Byte md5, eine andere Methode habe ich noch nicht eingebaut,
bin noch am optimieren.

dahead 3. Aug 2005 00:05

Re: Eindeutiger Vergleich für große Dateien gesucht
 
ok, dann habe ich es verstanden. mich hätte nur die geschwindigkeit bei einer byte-per-byte analyse gewundert. bei mir rotieren da die festplatten köpfe, und bei deinem programm war er in einem bruchteil der zeit damit fertig.

bigg 3. Aug 2005 00:08

Re: Eindeutiger Vergleich für große Dateien gesucht
 
Sind denn die Ergebnisse identisch oder gab es dabei abweichungen?

dahead 3. Aug 2005 00:12

Re: Eindeutiger Vergleich für große Dateien gesucht
 
du meinst bei meinen tests nehme ich an?

naja, kann ich so nicht sagen, da ich nur diese eine datei kopiert und wieder eingefügt habe (ich habe leider nicht sonderlich viele dateien größer 1 gb auf meinem rechner liegen). der test ist also nicht aussagekräftig. ich wollte halt für den fall der fälle (kollision) doch einen byte-per-byte vergleich einbauen.

der startet (ähnlich wie bei dir) erst, wenn dateigröße und md5 hash gleich sind.

negaH 3. Aug 2005 00:25

Re: Eindeutiger Vergleich für große Dateien gesucht
 
@dahead:

Zitat:

byte pro byte vergleich der kompletten filestreams
Du benutzt noch Filestreams ?
Suche mal nach "Memmory Mapped Files" und benutze diese neuere Technik des OS.
FileStreams sind schön und gut haben aber den Nachteil das sie auf eienr "älteren" Schnittstelle zum Datenträger basieren. Ich habe mit MMF's die ich readonly und in partitionen erzeuge bessere Performance erzielt.


Delphi-Quellcode:
type
  TMMF = class(TCustomMemoryStream) // readonly Memory Mapped File
  private
    FHandle: THandle;
    FMapping: THandle;
  public
    constructor Create(const FileName: String);
    destructor Destroy; override;
    function Write(const Buffer; Count: Longint): Longint; override;
  end;

constructor TMMF.Create(const FileName: String);
var
  P: Pointer;
  S: Integer;
begin
  FHandle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
  if FHandle > 0 then
  begin
    S := GetFileSize(FHandle, nil);
    if S > 0 then
    begin
      FMapping := CreateFileMapping(FHandle, nil, PAGE_READONLY, 0, 0, nil);
      if FMapping <> 0 then
      begin
        P := MapViewOfFile(FMapping, FILE_MAP_READ, 0, 0, 0);
        if P <> nil then inherited SetPointer(P, S);
      end;
    end;
  end;
  inherited Create;
end;

destructor TMMF.Destroy;
begin
  if Memory <> nil then UnmapViewOfFile(Memory);
  if FMapping <> 0 then CloseHandle(FMapping);
  if FHandle <> 0 then CloseHandle(FHandle);
  inherited Destroy;
end;

function TMMF.Write(const Buffer; Count: Longint): Longint;
begin
  Result := 0; // we should raise a exception here, but useloss
end;
die obige quick&dirty Klasse kann als Ersatz für deinen Filestream dienen. Da sie von TCustomMemoryStream abgeleitet wurde kannst du über .Memory und .Size direkt per CompareMem() zwei Dateien vergleichen oder eben eine Hashfunktion drüberrutschen lassen.
Wie gesagt sie ist aber Quick&Dirty und man müsste noch einige Kleinigkeiten verbessern. Für deine ersten Versuche zum Vergleich der Performance zu TFileStream dürfte es aber reichen.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr.
Seite 4 von 12   « Erste     234 56     Letzte »    

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