AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Eindeutiger Vergleich für große Dateien gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

Eindeutiger Vergleich für große Dateien gesucht

Ein Thema von dahead · begonnen am 2. Aug 2005 · letzter Beitrag vom 9. Mai 2014
 
Benutzerbild von negaH
negaH

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

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
 


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:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz