Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   File compare (https://www.delphipraxis.net/160642-file-compare.html)

DeddyH 24. Mai 2011 14:36

AW: File compare
 
Also nochmal aufgebohrt (aber immer noch nicht getestet^^):
Delphi-Quellcode:
function FilesEqual(const First, Second: TFilename; DiffList: TStrings): Boolean;
var
  s1, s2: TStringlist;
  i: integer;
begin
  Assert(Assigned(DiffList));
  Result := FileExists(First) and FileExists(Second);
  if Result then
    begin
      DiffList.BeginUpdate;
      try
        DiffList.Clear;
        s1 := TStringlist.Create;
        try
          s1.LoadFromFile(First);
          s2 := TStringlist.Create;
          try
            s2.LoadFromFile(Second);
            i := 0;
            while (i < s1.Count) and (i < s2.Count) do
              begin
                if s1[i] <> s2[i] then
                  DiffList.AddObject(s1[i], TObject(i));
                inc(i);
              end;
          finally
            s2.Free;
          end;
        finally
          s1.Free;
        end;
      finally
        DiffList.EndUpdate;
      end;
      Result := DiffList.Count = 0;
    end;
end;

value is NULL 24. Mai 2011 14:40

AW: File compare
 
OK, bin halt eher unskilled, habs jetzt aber, zumindest funktionierts :)

Delphi-Quellcode:
function test(const First, Second: TFilename; out stringL: TStringlist): Boolean;
var
  s1, s2: TStringlist;
  i: integer;
begin
  Result := FileExists(First) and FileExists(Second);
  if Result then
    begin
      s1 := TStringlist.Create;
      try
        s1.LoadFromFile(First);
        s2 := TStringlist.Create;
        try
          s2.LoadFromFile(Second);
          i := 0;
              while (i < s1.Count) and (i < s2.Count) do
              begin
                Result := s1[i] = s2[i];
                if not Result then
                  begin
                    stringL.Add(s1[i]);
                    //i := s1.Count;
                  end;
                  inc(i);
                end;
        finally
          s2.Free;
        end;
      finally
        s1.Free;
      end;
    end;
end;
aufruf:

Delphi-Quellcode:
    try
      sl := TStringlist.Create;
      test_functions.test('C:\software.txt','C:\software2.txt',sl);
      Writeln(sl.Text);
    finally
      sl.Free;
    end;
Könnte man hier etwas aussetzen ?

LG

Uwe Raabe 24. Mai 2011 14:42

AW: File compare
 
Zitat:

Zitat von value is NULL (Beitrag 1102601)
Delphi-Quellcode:
function test(const First, Second: TFilename; out stringL: TStringlist): Boolean;

Das mit dem "out" würde ich mir nochmal überlegen. Einfach gar nichts hinschreiben, dann passt es schon.

DeddyH 24. Mai 2011 14:44

AW: File compare
 
Da Deine Funktion nach dem ersten bemerkten Unterschied aussteigt, kannst Du auch auf die Stringliste verzichten und gleich einen String als Var-Parameter übergeben. Und ein Objekt als out-Paramter ist nicht das Wahre. Willst Du alle Unterschiede (zumindest die, die innerhalb der minimalen Zeilenanzahl beider Dateien liegen) auflisten, schau Dir einmal meine letzte Version an, die speichert auch die Zeilennummer mit (wenn auch etwas versteckt als TObject).

Jumpy 24. Mai 2011 15:41

AW: File compare
 
Als Advocatus Diaboli ein Einwurf zum Nachdenken. Nicht an DeddyH's Lösung, sondern an das, was man erreichen will:

Wenn du 1000 Zeilen hast, in einer Datei aber eine neue Zeile an z.B. Stelle 3 eingefügt wurde, dann sind die Dateien bis auf diese eine Zeile gleich, du bekommst aber 997 Fehler.

DeddyH 24. Mai 2011 15:42

AW: File compare
 
Daran hatte ich auch schon gedacht, aber wie will man das verhindern?

[edit] Abgesehen davon kann das ja auch richtig sein, je nachdem, was man beabsichtigt. [/edit]

p80286 24. Mai 2011 15:46

AW: File compare
 
Ins unreine gedacht,
für jede Zeile einen Hash-wert erstellen und gleiche Zeilen/Hash-werte aus dem Topf entfernen.
Was übrig bleibt ist nicht gleich.

Gruß
K-H

Jumpy 24. Mai 2011 15:48

AW: File compare
 
[edit]Bezieht sich auf #36, war zu lahm[/edit]

Kannste nicht verhindern. Man kann jetzt die Fuzzy-Pistole rausholen und Ähnlichkeitsanalysen machen usw. aber wie du schon sagst: Es hängt davon ab, was man damit machen will und vllt. ist es genauso schon beabsichtigt.

value is NULL 24. Mai 2011 17:46

AW: File compare
 
hm ihr habt recht... Die Idee von mir ist momentan zerstört :)

Der Plan war eigentlich mir alle installierten programme und windows patches auszulesen. Diese speichere ich in ein Textfile.

anschließend starte ich das Programm neu und lese mir die programme erneut ein, dann werden die frisch eingelesenen mit dem vorhin abgelegten file verglichen.

Sollte sich etwas geändert haben reagiere ich dementsprechend... Das File ändert sich NIE, habe dazu einen Pararmeter eingebaut der die Liste bei bedarf neu erstellt.

Wie könnte ich das realisieren? Die Funktion zum auslesen der Programme über die Registry funktioniert eigentlich prima aber die compare geschichte zerbricht mir den Kopf!

LG

blauweiss 24. Mai 2011 17:57

AW: File compare
 
Hallo value is NULL,

wenn's nur um den Abgleich zweier Listen geht, dann gehe doch einfach die zweite Liste durch und prüfe mit Liste1.IndexOf ab, ob der jeweilige Eintrag dort drin ist. Ggfs. das Gleiche andersrum (Liste1 gegen Liste 2), um gelöschte Einträge zu finden.

Gruß
blauweiss


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr.
Seite 4 von 6   « Erste     234 56      

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