Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zwei Verzeichnisse vergleichen und Vorschau anzeigen

  Alt 25. Apr 2021, 17:17
OK, Schritt für Schritt. Und nehmen wir erstmal an, es wären keine Unterverzeichnisse im Spiel.

A und B sind die Stringlisten mit den kompletten Pfad-/Dateinamen. iA und iB verwenden wir als Index in die jeweilige StringList. fA und fB enthalten den reinen Dateinamen ohne den Pfadanteil (wie gesagt, Unterverzeichnisse im Moment noch außen vor).

Delphi-Quellcode:
      iA := 0;
      iB := 0;
      while (iA < A.Count) and (iB < B.Count) do begin
Die Schleife wird ausgeführt, solange beide Indizes noch gültige Einträge in den Stringlisten referenzieren.

Delphi-Quellcode:
        fA := ExtractFileName(A[iA]);
        fB := ExtractFileName(B[iB]);
extrahiert die Dateinamen aus den Pfadnamen.

Delphi-Quellcode:
        if fA < fB then begin
          Writeln('copy: ', A[iA]);
          Inc(iA);
        end
Die Listen sind sortiert und der aktuelle Dateiname aus A ist kleiner als der aus B. Das bedeutet, dass diese Datei in A noch nicht in B vorhanden ist. Also kopieren.

Delphi-Quellcode:
        
        else if fA > fB then begin
          Writeln('delete: ', B[iB]);
          Inc(iA);
        end
Der aktuelle Dateiname aus A ist größer als der aus B. Das bedeutet, dass die Datei in B nicht in A vorkommt. Also löschen.

Delphi-Quellcode:
        else begin
          Writeln('if diff ', fa, ' then copy ', A[iA], ' to ', B[iB]);
          Inc(iA);
          Inc(iB);
        end;
Die beiden Dateinamen sind gleich und existieren somit in beiden Listen. Jetzt müssen wir die Zusatzinformationen vergleichen um zu entscheiden ob die Datei aus A nach B kopiert werden muss.

Delphi-Quellcode:
      while (iA < A.Count) do begin
        Writeln('copy: ', A[iA]);
        Inc(iA);
      end;
      while (iB < B.Count) do begin
        Writeln('delete: ', B[iB]);
        Inc(iB);
      end;
Nach Ende der großen While-Schleife sind wir am Ende entweder von A oder B (oder beiden) angekommen und müssen gegebenenfalls noch die verbleibenden Einträge der anderen Liste verarbeiten. Einträge aus A werden kopiert, die aus B gelöscht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat