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
Seite 2 von 3     12 3      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 14:12
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#12

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 14:27
Zitat von Neutral General:
Verbesserungsvorschlag
committed siehe Post #1
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 14: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;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:04
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...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:08
Zitat von Neutral General:
Du machst also wenn du 3 Klassen erstellst 3 try-finally Blöcke?
Ja, genau das.

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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:09
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

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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:17
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
In deinen eigenen Programme kannst'e das "gern" machen.
Aber bei öffentlichen Codes für Andere ... was wäre denn, wenn die ESA 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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:20
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 ^^
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#19

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:22
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
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dateien byteweise vergleichen

  Alt 14. Mai 2010, 15:26
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 06:45 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