Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

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