Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   2 Textdateien vergleichen (https://www.delphipraxis.net/205562-2-textdateien-vergleichen.html)

TigerLilly 23. Sep 2020 21:01

2 Textdateien vergleichen
 
TFile.Equals(<filename>) gibt es ja leider nicht. Was ist die eleganteste Möglichkeit, zu prüfen, ob zwei Dateien den gleichen Inhalt haben? Gibt es da in der Delphi RTL etwas?

tx

Der schöne Günther 23. Sep 2020 21:10

AW: 2 Textdateien vergleichen
 
Haben beide Dateien die gleiche Größe? Wenn nein, dann ist das Ergebnis schon vorzeitig
Delphi-Quellcode:
false
.

Dann: Beide in einem BufferedFileStream öffnen und Byte für Byte vergleichen - Sobald ungleich dann ist das Ergebnis
Delphi-Quellcode:
false
.

Dann: Ergebnis ist
Delphi-Quellcode:
true
, Dateien sind identisch.

stahli 23. Sep 2020 21:12

AW: 2 Textdateien vergleichen
 
StringList1.Text=StringList2.Text

Hängt natürlich von der Art der Dateien und Anzahl der Prüfungen ab, ob das so taugt...

lxo 23. Sep 2020 21:16

AW: 2 Textdateien vergleichen
 
Hash ermitteln und vergleichen MD5 oder sonstiges evtl. ?
System.Hash

Der schöne Günther 23. Sep 2020 21:19

AW: 2 Textdateien vergleichen
 
Zitat:

Zitat von stahli (Beitrag 1474125)
StringList1.Text=StringList2.Text

Sicher nicht die beste Wahl wenn die Dateien groß oder keine Textdateien sind.

Dalai 23. Sep 2020 21:20

AW: 2 Textdateien vergleichen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1474124)
Haben beide Dateien die gleiche Größe? Wenn nein, dann ist das Ergebnis schon vorzeitig
Delphi-Quellcode:
false
.

Das kommt darauf an, ob man Zeilenumbrüche mit vergleichen will oder nicht.

Grüße
Dalai

himitsu 23. Sep 2020 22:08

AW: 2 Textdateien vergleichen
 
Delphi-Quellcode:
if TFile.ReadAllText(FileA) = TFile.ReadAllText(FileB) then
  ...
Leider gibt es aus irgendeinem schwachsinnigem Grund in TFile oder sonstwo im Delphi kein GetFileSize, sonst könnte man es Binär auch mit einer einzen Zeile lösen.
Und leider gibt es auch keinen Comparer für TBytes. [add] Mal nachsehn, ob inzwischen, aber ich glaub nicht dran. [/add]

Delphi-Quellcode:
A := TFile.ReadAllBytes(FileA);
B := TFile.ReadAllBytes(FileB);
if (Length(A) = Length(B)) and ((A = nil) or CompareMemory(@A[0], @B[0], Length(A))) then
  ...
[edit] uhhhh, da gab's doch was Neues ... inline :duck:
Delphi-Quellcode:
var A := TFile.ReadAllBytes(FileA); var B := TFile.ReadAllBytes(FileB); if (Length(A) = Length(B)) and CompareMemory(Pointer(A), Pointer(B), Length(A))) then

und mit Speichergau, aber WindowsFileCache hilft etwas
Delphi-Quellcode:
if (Length(TFile.ReadAllBytes(FileA)) = Length(TFile.ReadAllBytes(FileB))) and CompareMemory(Pointer(TFile.ReadAllBytes(FileA)), Pointer(TFile.ReadAllBytes(FileB)), Length(TFile.ReadAllBytes(FileA)))) then

[/edit]

Und natürlich knallt das alles, wenn die Dateien nicht existieren oder nicht lesbar sind,
aber Speicherlecks sind dadurch nicht zu befürchten.



Zitat:

Delphi-Quellcode:
// und vorher noch LoadFromFile
StringList1.Text=StringList2.Text

Bei etwas größeren Dateien natürlich der Speichergau.

Beim Lesen als Stream, durch TEncoding gejagt als String, in String-Array zerlegt (Zeilen), dann über .Text wieder in "einen" String und nun erst verglichen.
Aber zumindestens würden unterschiedliche Zeilenumbrüche (#10, #13 oder #13#10) und BOMs ignoriert, vielleicht noch mit Trim drumrum. :stupid:

Bernhard Geyer 24. Sep 2020 06:52

AW: 2 Textdateien vergleichen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1474127)
Zitat:

Zitat von stahli (Beitrag 1474125)
StringList1.Text=StringList2.Text

Sicher nicht die beste Wahl wenn die Dateien groß oder keine Textdateien sind.

Soll aber Textdatei sein.
Und wenn man Textdateien vergleichen will, dann sollte die Codierung (UTF8, UTF-16) ja auch egal sein, so das das laden in einen String(List) vermutlich nötig ist.

TigerLilly 24. Sep 2020 07:28

AW: 2 Textdateien vergleichen
 
:- ) Danke für die Tipps!

- Codierung unterschiedlich --> Dateien sind unterschiedlich
- Zeilenumbrüche anders --> Dateien sind unterschiedlich

Also kann man wirkliche Byteweise vergleichen.

CompareMemory ist aber nicht Teil der RTL - sondern?

TBufferedFileStream optimiert bei wiederholtem Lesen, da für den Vergleich nur 1x gelesen werden muss, genügt doch TFileStream?

Da ich nach dem ersten Unterschied schon aufhören kann, ist es doch performanter, wenn ich die Dateien zeichenweise lese + vergleiche + nicht den ganzen Inhalt mit TFile.ReadAllBytes(FileA) einlese und dann erst vergleiche, oder?

Der schöne Günther 24. Sep 2020 07:40

AW: 2 Textdateien vergleichen
 
Zitat:

Zitat von TigerLilly (Beitrag 1474142)
TBufferedFileStream optimiert bei wiederholtem Lesen, da für den Vergleich nur 1x gelesen werden muss, genügt doch TFileStream?

Gemeint ist nicht die Datei mehrmals hintereinander zu lesen.
Wenn du zeichenweise liest, dann ist das doch wiederholtes Lesen.

Wenn du dir hingegen die gesamte Datei in den Speicher ziehst (wie z.B. auch mit TFile.ReadAllBytes(..)) dann macht mit oder ohne Puffer keinen Unterschied.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.
Seite 1 von 5  1 23     Letzte » 

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