AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien byteweise vergleichen

Ein Thema von HeikoAdams · begonnen am 14. Mai 2010 · letzter Beitrag vom 14. Mai 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.515 Beiträge
 
Delphi 12 Athens
 
#1

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 13:57
Zitat von HeikoAdams:
committed siehe Post #1
Schau dir aber dazu bitte meine beiden Codes aus Beitrag #4 an ... speziell die Streams und die zugehörigen Try-Finally.

Ein Resourcen-Schutzblock (Try-Finally) fängt immer direkt nach der Resourcen-Beschaffung an,
um diese Resource auch richtig zu schützen/freizugeben.

Delphi-Quellcode:
{resource reservieren}
try
  ...
finally
  {resource freigeben}
end;
und bei 2 Resourcen wäre es dann
Delphi-Quellcode:
{resource 1 reservieren}
try
  ...
  {resource 2 reservieren}
  try
    ...
  finally
    {resource 2 freigeben}
  end;
  ...
finally
  {resource 1 freigeben}
end;
Also muß es so gemacht werden, um einen korrekten Schutz zu gewährleisten:
Delphi-Quellcode:
SourceFile := TStream.Create(...);
try
  DestFile := TStream.Create(...);
  try
    SourceFile.LoadFromFile(...);
    DestFile.LoadFromFile(...);
    ...
  finally
    DestFile.Free;
  end;
finally
  SourceFile.Free;
end;
Folgendes geht nur unter zwei Annahmen:
- man kann der Resource einen prüfbaren Wert für "Resource nicht reserviert" zuweisen
- man kann ausschließen, daß beim Freigeben keine Exception auftritt
Delphi-Quellcode:
DestFile := nil;
SourceFile := TFileStream.Create(aSourceFile, fmOpenRead or fmShareDenyWrite);
try
  DestFile := TFileStream.Create(aDestFile, fmOpenRead or fmShareDenyWrite);
  SourceFile.LoadFromFile(...);
  DestFile.LoadFromFile(...);
  ...
finally
  {if Assigned(DestFile) then} DestFile.Free; // aber dieses ist schon in .Free eingebaut
  SourceFile.Free;
end;
Das DestFile:=nil; wurde in vorherigen Beispielen nur aus logischer Sicht nach SourceFile:=TFileStream.Create verschoben und weil dieses keine Exteption auslösen kann (es sei denn der Stack ist vorher schon geschrottet, aber dann ist eh alles egal).

OK, wenn man zusätzlich noch ausschließen kann, daß keine Exception beim Erstellen auftritt, dann ginge auch dieses, aber sowas ist beim Erstellen von Klassen eben nicht sichergestellt.
Delphi-Quellcode:
{resource 1 reservieren}
{resource 2 reservieren}
try
  ...
finally
  {resource 2 freigeben}
  {resource 1 freigeben}
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:38 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