Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#40

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

  Alt 3. Aug 2005, 00:25
@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
  Mit Zitat antworten Zitat