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.