while (i < lCount)
or (ri < rCount)
do begin
if i < lCount
then l := FLocalFL.Items[Integer(lList.Objects[i])]
else begin
// alle restlichen Remote-Dateien in die Delete-Listen
while ri < rCount
do begin
if FRemoteFL.Items[Integer(rList.Objects[ri])].IsDir
then delDirs.AddObject('
-d' + rList[ri], rList.Objects[ri])
else delFiles.AddObject('
-f' + rList[ri], rList.Objects[ri]);
inc(ri);
end;
break;
// und raus
end;
if ri < rCount
then rl := FRemoteFL.Items[Integer(rList.Objects[ri])]
else begin
// alle restlichen Local-Dateien in die Add-Listen
while i < lCount
do begin
if FLocalFL.Items[Integer(lList.Objects[i])].IsDir
then addDirs.AddObject('
+d' + lList[i], lList.Objects[i])
else addFiles.AddObject('
+f' + lList[i], lList.Objects[i]);
inc(i);
end;
break;
// und raus
end;
if not DoCompare(l.
Name, rl.
Name)
then begin
// Datei suchen
x := ri;
while (x < rCount)
and (
not DoCompare(rList[x], l.
Name))
do inc(x);
if x = rCount
then begin
// nicht gefunden
// Datei/Ordner hinzufügen
if l.IsDir
then addDirs.AddObject('
+d' + l.
Name, lList.Objects[i])
else addFiles.AddObject('
+f' + l.
Name, lList.Objects[i]);
// neue Datei // LocalIndex
dec(ri);
// und ri am Ende nicht erhöhen
end else begin
// gefunden
// Alle dazwischenliegenden Dateien löschen
while ri < x
do begin
if FRemoteFL.Items[Integer(rList.Objects[ri])].IsDir
then delDirs.AddObject('
-d' + rList[ri], rList.Objects[ri])
else delFiles.AddObject('
-f' + rList[ri], rList.Objects[ri]);
inc(ri);
end;
// Daten holen
rl := FRemoteFL.Items[Integer(rList.Objects[ri])];
end;
end;
if DoCompare(l.
Name, rl.
Name)
then begin
if l.IsDir
and rl.IsDir
then begin end // Verzeichnisse nicht überprüfen
else if l.IsDir <> rl.IsDir
then begin
if rl.IsDir
then begin
// eine Datei ist ein remote Verzeichnis ??? -> remote Verzeichnis mit Subdirs löschen.
delDirs.AddObject('
-d' + rl.
Name, rList.Objects[ri]);
// RemoteIndex
dir := rl.
Name + '
/';
len := length(dir);
inc(ri);
// Unterordner löschen
while (ri < rCount)
do begin
rl := FRemoteFL.Items[Integer(rList.Objects[ri])];
if DoCompare(copy(rl.
Name, 1, len), dir)
then begin
if rl.IsDir
then delDirs.AddObject('
-d' + rl.
Name, rList.Objects[ri])
else delFiles.AddObject('
-f' + rl.
Name, rList.Objects[ri]);
// RemoteIndex
end else break;
inc(ri);
end;
dec(ri);
// und die Datei hinzufügen
addFiles.AddObject('
+f' + l.
Name, lList.Objects[i]);
// LocalIndex
end else begin
// ein Verzeichnis ist eine remote Datei ??? -> remote Datei löschen
delFiles.AddObject('
-f' + rl.
Name, rList.Objects[ri]);
// RemoteIndex
// und das Verzeichnis hinzufügen
addDirs.AddObject('
+d' + l.
Name, lList.Objects[i]);
// LocalIndex
end;
end else begin
// nur Dateien hier:
update := False;
if (FUpdateDate)
then begin
update := ((
not FUpdateOnlyNewerDate)
and
(l.LastWriteTime <> rl.LastWriteTime))
or
((FUpdateOnlyNewerDate)
and
(l.LastWriteTime > rl.LastWriteTime));
end;
if (FUpdateSize)
and (l.Size <> rl.Size)
then update := True;
if update
then
updFiles.AddObject('
*f' + l.
Name, lList.Objects[i]);
// LocalIndex
end;
// if
end;
// if
inc(i);
inc(ri);
end;
// while