![]() |
Re: Dateien byteweise vergleichen
Verbesserungsvorschlag:
Delphi-Quellcode:
function ByteCompFiles(const aSourceFile, aDestFile: String): Boolean;
var SourceFile, DestFile: TMemoryStream; begin SourceFile := TMemoryStream.Create; DestFile := TMemoryStream.Create; try SourceFile.LoadFromFile(aSourceFile); DestFile.LoadFromFile(aDestFile); Result := (SourceFile.Size = DestFile.Size) and (CompareMem(SourceFile.Memory, DestFile.Memory, SourceFile.Size)); finally DestFile.Free; SourceFile.Free; end; end; |
Re: Dateien byteweise vergleichen
Zitat:
|
Re: Dateien byteweise vergleichen
Zitat:
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:
und bei 2 Resourcen wäre es dann
{resource reservieren}
try ... finally {resource freigeben} end;
Delphi-Quellcode:
Also muß es so gemacht werden, um einen korrekten Schutz zu gewährleisten:
{resource 1 reservieren}
try ... {resource 2 reservieren} try ... finally {resource 2 freigeben} end; ... finally {resource 1 freigeben} end;
Delphi-Quellcode:
Folgendes geht nur unter zwei Annahmen:
SourceFile := TStream.Create(...);
try DestFile := TStream.Create(...); try SourceFile.LoadFromFile(...); DestFile.LoadFromFile(...); ... finally DestFile.Free; end; finally SourceFile.Free; end; - 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:
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).
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; 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; |
Re: Dateien byteweise vergleichen
Hi,
Du machst also wenn du 3 Klassen erstellst 3 try-finally Blöcke? Finde ich etwas übertrieben. Beim erstellen eines Objekts SOLLTE eigentlich nichts schief gehen... |
Re: Dateien byteweise vergleichen
Zitat:
Zitat:
Die Ausnahmen für die Zusammenfassung der Try-Finally hatte ich grade oben noch mit dazueditiert. |
Re: Dateien byteweise vergleichen
Jaaa.. Natürlich KANN etwas passieren. Aber 3 try-finally Blöcke. Das sieht ja schrecklich aus und da blickt man doch nicht mehr durch :shock:
Naja meinetwegen. Richtiger ist deine Version .. schon. Stimmt schon. Aber wenn ich jetzt keine Software für die NASA schreibe oder so werde ich glaube ich ganz fahrlässig darauf verzichten :mrgreen: |
Re: Dateien byteweise vergleichen
Zitat:
Aber bei öffentlichen Codes für Andere ... was wäre denn, wenn die ![]() Und wie gesagt, mit einer kleinen Umstelltung kannst'e hier die beiden Streams auch mit nur einem Try-Finally absichern. :angel2: |
Re: Dateien byteweise vergleichen
Wenn sie von mir Code haben will, dann bekommt sie um jede Zeile ein try-finally wenn sie will xD
Wenn sie Code von mir findet, dann ist das ja nicht mein Problem wenn die den 1:1 übernehmen und 1 try-finally fehlt ^^ |
Re: Dateien byteweise vergleichen
Zitat:
|
Re: Dateien byteweise vergleichen
Wenn man aber jetzt davon ausgehen darf, daß alle Codes potentiell fehlerhaft/unsicher sind,
dann kann man auch gleich alles selber neu schreiben und niemals Fremdcodes verwenden. Und gerade bei unserer Codelib geh ist erstmal davon aus, daß darin geprüfter/sicherer Code enthalten ist, bzw. daß derartiger Code keine bekannten Fehler enthält. :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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