Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Unerwarteter OutOfMemory-Fehler (https://www.delphipraxis.net/155055-unerwarteter-outofmemory-fehler.html)

blablab 8. Okt 2010 12:19

AW: Unerwarteter OutOfMemory-Fehler
 
Hab ich auch schon dran gedacht, aber ich find das ist nicht unbedingt nötig. Wenn es wirklich immer zum OutOfMemory käme, würde ich es mit Hash probiern (auch wenn ich mich damit nicht auskenne). Aber da das ja eher eine Ausnahmesituation ist reicht es mir so. Mir ist es dann nur wichtig, dass es nicht zu einem Fehler kommt und das Programm dann abstürzt.

Luckie 8. Okt 2010 12:26

AW: Unerwarteter OutOfMemory-Fehler
 
Zitat:

Zitat von blablab (Beitrag 1054506)
Das Programm sucht nach Datei-Duplikaten in einem bestimmten Ordner. Wenn 2 Dateien dieselbe Größe haben, vergleicht er die Dateien um dann zu entscheiden ob sie gleich sind oder nicht.

An Hand der Größe zu entscheiden, ob Dateien eventuell gleich sein könnten, ist aber kein sehr gutes Kriterium. Ich möchte nicht wissen, wie viele Dateien mit der Größe von 1 KB ich auf der Platte habe.

blablab 8. Okt 2010 13:08

AW: Unerwarteter OutOfMemory-Fehler
 
Stimmt, hast du ein Vorschlag was noch ein Kriterium sein könnte?

xZise 8. Okt 2010 13:14

AW: Unerwarteter OutOfMemory-Fehler
 
Moin,
naja ein Hash erstellen, wenn der immer noch gleich ist, die Dateien bitweise überprüfen. Außerdem kannst du nicht alle Dateien in den RAM laden, wenn ich hier schon sehe, das ich teilweise Dateien von 11 GiB Größe habe.

MfG
Fabian

Sir Rufo 8. Okt 2010 13:57

AW: Unerwarteter OutOfMemory-Fehler
 
Wenn man von einer Datei einen MD5-Hash erstellt und dazu nochmal einen CRC32 und diese beiden Werte gleich sind nebst der Größe, dann kann man die Datei getrost als gleich ansehen

Für einen direkten Vergleich der dann noch vorhandenen Dateien kann man mittels FileStream lösen indem dann Byte für Byte verglichen wird. Dazu werden die Dateien aber nicht in den Speicher geladen.

BTW. es gibt da Backup-Programme, die sehr gut funktionieren, die entscheiden darüber, ob die Datei schon gesichert ist oder nicht über Hash-Werte.
Delphi-Quellcode:
uses IdHash, IdHashMessageDigest;

{...}

function MD5FromFile( const FileName : string ) : string;
  var
    idmd5 : TIdHashMessageDigest5;
    fs : TFileStream;
  begin
    idmd5 := TIdHashMessageDigest5.Create;
    fs := TFileStream.Create( FileName, fmOpenRead or fmShareDenyWrite );
    try
      Result := idmd5.HashStreamAsHex( fs );
    finally
      fs.Free;
      idmd5.Free;
    end;
  end;
oder hier die ganz genaue Variante mit MD5, CRC32 und Größe
Delphi-Quellcode:
uses IdHash, IdHashMessageDigest;

{...}

function MD5H32SizeFromFile( const FileName : string ) : string;
  var
    idmd5 : TIdHashMessageDigest5;
    idh32 : TIdHash32;
    fs : TFileStream;
  begin
    idmd5 := TIdHashMessageDigest5.Create;
    idh32 := TIdHash32.Create;
    fs := TFileStream.Create( FileName, fmOpenRead or fmShareDenyWrite );
    try
      fs.Position := 0;
      Result := idmd5.HashStreamAsHex( fs );
      fs.Position := 0;
      Result := Result + idh32.HashStreamAsHex( fs );
      Result := Result + IntToHex( fs.Size, 8 );
    finally
      fs.Free;
      idmd5.Free;
      idh32.Free;
    end;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr.
Seite 3 von 3     123   

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