AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Unerwarteter OutOfMemory-Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

Unerwarteter OutOfMemory-Fehler

Ein Thema von blablab · begonnen am 6. Okt 2010 · letzter Beitrag vom 8. Okt 2010
Antwort Antwort
Seite 3 von 3     123   
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#21

AW: Unerwarteter OutOfMemory-Fehler

  Alt 8. Okt 2010, 13:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#22

AW: Unerwarteter OutOfMemory-Fehler

  Alt 8. Okt 2010, 13:26
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#23

AW: Unerwarteter OutOfMemory-Fehler

  Alt 8. Okt 2010, 14:08
Stimmt, hast du ein Vorschlag was noch ein Kriterium sein könnte?
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#24

AW: Unerwarteter OutOfMemory-Fehler

  Alt 8. Okt 2010, 14:14
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#25

AW: Unerwarteter OutOfMemory-Fehler

  Alt 8. Okt 2010, 14:57
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Okt 2010 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 14:25 Uhr.
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