AGB  ·  Datenschutz  ·  Impressum  







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

2 Textdateien vergleichen

Ein Thema von TigerLilly · begonnen am 23. Sep 2020 · letzter Beitrag vom 27. Sep 2020
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
TigerLilly
Online

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#1

2 Textdateien vergleichen

  Alt 23. Sep 2020, 22:01
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
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: 2 Textdateien vergleichen

  Alt 23. Sep 2020, 22:10
Haben beide Dateien die gleiche Größe? Wenn nein, dann ist das Ergebnis schon vorzeitig false .

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

Dann: Ergebnis ist true , Dateien sind identisch.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: 2 Textdateien vergleichen

  Alt 23. Sep 2020, 22:12
StringList1.Text=StringList2.Text

Hängt natürlich von der Art der Dateien und Anzahl der Prüfungen ab, ob das so taugt...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#4

AW: 2 Textdateien vergleichen

  Alt 23. Sep 2020, 22:16
Hash ermitteln und vergleichen MD5 oder sonstiges evtl. ?
System.Hash
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: 2 Textdateien vergleichen

  Alt 23. Sep 2020, 22:19
StringList1.Text=StringList2.Text
Sicher nicht die beste Wahl wenn die Dateien groß oder keine Textdateien sind.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#6

AW: 2 Textdateien vergleichen

  Alt 23. Sep 2020, 22:20
Haben beide Dateien die gleiche Größe? Wenn nein, dann ist das Ergebnis schon vorzeitig false .
Das kommt darauf an, ob man Zeilenumbrüche mit vergleichen will oder nicht.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: 2 Textdateien vergleichen

  Alt 23. Sep 2020, 23:08
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
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
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Sep 2020 um 23:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: 2 Textdateien vergleichen

  Alt 24. Sep 2020, 07:52
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
TigerLilly
Online

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: 2 Textdateien vergleichen

  Alt 24. Sep 2020, 08:28
:- ) 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?
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: 2 Textdateien vergleichen

  Alt 24. Sep 2020, 08:40
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 12:05 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