1. Nemas potrebe da utvrdjujes velicinu skinutog fajla. Pre pocetka downloada procitas velicinu fajla na serveru i to postavis za Max u ProgressBaru , a u obradi dogadjaja OnWork menjas poziciju progressa koristeci parametar AWorkCount.
Code:
procedure DownloadFile(ARemoteFolder,ARemoteFileName, ALocalFileName:string);
begin
if IdFTP1.Connected
then begin
IdFTP1.TransferType := ftBinary;
IdFTP1.ChangeDir(ARemoteFolder);
ProgressBar1.Max := IdFTP1.Size(ARemoteFileName);
IdFTP1.Get(ARemoteFileName, ALocalFileName, true);
end
else Raise Exception.Create('Nije uspostavljena veza sa serverom');
end;
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position := AWorkCount;
end;
2.
Da bi skinuo sve sto se nalazi u nekom folderu moras napraviti rekurzivnu porceduru koja ce za sadrzaj foldera skinuti sve datoteke iz nejga a onda udje u svaki podfolder pa pozove samu sebe za tekuci folder, pa ako i on ima sub foldere opet isto....
TidFtp ima property DirectoryListing koji ti vraca sadrzaj foldera u obliku TIdFTPListItems;
Svaki item iz rezultantne kolekcije/liste je TIdFTPListItem.
Kad uhvatis jedan item za njega mozes da saznas da li je direktorijum, datoteka ili symbol ("..",".").
Ne mogu da isprobam ovu proceduru ali mislim da bi tako nekako trebalo da bude, s tim da ces možda morati da za svaki poziv procedure dinamicki kreiras po jednu instancu IdFTP.
Code:
procedure GetFolderContent(ARemoteFolder:string);
var FolderName:string;
RemoteItem:TIdFTPListItem;
i:integer;
LS:TStrings;
begin
if IdFTP1.Connected then
begin
LS := TStringList.Create;
try
IdFTP1.ChangeDir(ARemoteFolder);
IdFTP1.List(LS);
for i:=0 to LS.Count-1 do
begin
RemoteItem:=IdFTP1.DirectoryListing[i];
case RemoteItem.ItemType of
ditDirectory: GetFolderContent(RemoteItem.FileName);
ditFile:IdFTP1.Get(RemoteItem.FileName, RemoteItem.FileName, true);
ditSymbolicLink://ne radi nista;
end;
end;
finally
LS.Free;
end;
end;
end;