Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Dateien byteweise vergleichen (https://www.delphipraxis.net/151352-dateien-byteweise-vergleichen.html)

Neutral General 14. Mai 2010 13:12

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;

HeikoAdams 14. Mai 2010 13:27

Re: Dateien byteweise vergleichen
 
Zitat:

Zitat von Neutral General
Verbesserungsvorschlag

committed :-D siehe Post #1

himitsu 14. Mai 2010 13:57

Re: Dateien byteweise vergleichen
 
Zitat:

Zitat von HeikoAdams
committed :-D 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;

Neutral General 14. Mai 2010 14:04

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...

himitsu 14. Mai 2010 14:08

Re: Dateien byteweise vergleichen
 
Zitat:

Zitat von Neutral General
Du machst also wenn du 3 Klassen erstellst 3 try-finally Blöcke?

Ja, genau das.

Zitat:

Zitat von Neutral General
Beim erstellen eines Objekts SOLLTE eigentlich nichts schief gehen...

OutOfMemory (kein Speicher für die Klasse) und andere Exceptions im Konstructor können also nie auftreten?

Die Ausnahmen für die Zusammenfassung der Try-Finally hatte ich grade oben noch mit dazueditiert.

Neutral General 14. Mai 2010 14:09

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:

himitsu 14. Mai 2010 14:17

Re: Dateien byteweise vergleichen
 
Zitat:

Zitat von Neutral General
Aber wenn ich jetzt keine Software für die NASA schreibe oder so werde ich glaube ich ganz fahrlässig darauf verzichten :mrgreen:

In deinen eigenen Programme kannst'e das "gern" machen.
Aber bei öffentlichen Codes für Andere ... was wäre denn, wenn die ESA :zwinker: die neuen Raketensteuerprogramme in Delphi programmiert und dafür deinen Code verwendet?

Und wie gesagt, mit einer kleinen Umstelltung kannst'e hier die beiden Streams auch mit nur einem Try-Finally absichern. :angel2:

Neutral General 14. Mai 2010 14:20

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 ^^

HeikoAdams 14. Mai 2010 14:22

Re: Dateien byteweise vergleichen
 
Zitat:

Zitat von Neutral General
Wenn sie Code von mir findet, dann ist das ja nicht mein Problem wenn die den 1:1 übernehmen und 1 try-finally fehlt ^^

Ich bin zwar kein Jurist, aber damit dürftest Du wohl Recht haben. Wer ungeprüft Code von dritten übernimmt, dem ist nicht (mehr) zu helfen :wall:

himitsu 14. Mai 2010 14:26

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.
Seite 2 von 3     12 3      

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