[ freespace @ 24.10.2005. 12:45 ] @
napravio sam neki ftp client koji se spaja na odredjeni FTP server. Client se spoji na server, prikaze listu podataka za skidanje.

E sad:
1. Uspio sam napraviti download sa servera ali ne znam kako da napravim da kad mi se nesto pocne skidati da pocne puniti progressbar koji ce sluziti kao "download progress" (da vidim koliko je trenutno skinuto), trazio sam preko googla ali nisam nista skuzio i to sto sam nasao nije radilo (koristi Evente: OnWork ; OnWorkBegin; OnWorkEnd;)

2. Ne mogu skidati cjeli folder nego samo neki fajl u folderu (*.exe,*.txt, itd.)
Kad pokusam skinuti cjeli folder i sve subfoldere prijavi gresku da takav direktorij ne postoji
Kako da skinem cjeli folder sa servera i sve njegove podfoldere.
[ anon68680 @ 24.10.2005. 14:20 ] @
odredis velicinu filea na ftp serveru koristeci idftp1.Size(nazivfilea) i uneses tu vrednost u maxlength progres bara. Zatim odredis koliko je dosad skinuo odnosno odredis velicinu filea na disku(imam primer za to negde nacicu pa cu postovati ovde) i uradis progresbar1.progress:=filesizenahardu;
npr:
buttonclick;
idftp1.host:='nekitamohost';
idftp1.username:='username';
idftp1.password:='password';
IdFTP1.Get('Gimp-2.2pre1.tar.gz','C:\test.tar.gz',false);
ProgressBar1.Max:=IdFTP1.Size('Gimp-2.2pre1.tar.gz');
//
ovo dodas u onwork event:
while ProgressBar1.Max>myfilesize('Gimp-2.2pre1.tar.gz') do
ProgressBar1.Max:=myfilesize('Gimp-2.2pre1.tar.gz');
//i to je to
Sto se tice ovog drugog ne znam mozda bi trebao da probas sa '/putanja/*.*'...


[Ovu poruku je menjao krza dana 24.10.2005. u 16:09 GMT+1]
[ anon68680 @ 24.10.2005. 14:25 ] @
function myFileSize(fName: string): int64;
var sr: TSearchRec;
begin
try
Result:=0;
FindFirst(fName, faAnyFile, sr);
Result:=sr.FindData.nFileSizeHigh*65535+sr.FindData.nFileSizeLow;
except
end;
end;

koristis ovo da bi odredio velicinu filea..
[ freespace @ 24.10.2005. 18:14 ] @
ovo mi je sve jasno, ali da na timer metnem da pokazuje velicinu fajla na disku u progressbar-u ili kako?
[ marcha @ 25.10.2005. 01:05 ] @
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;

[ ntojzan @ 26.10.2005. 18:06 ] @
Imam i ja jedno malo pitanje vezano za istu temu.

Kako da obrisem -sve- u jednom folderu? (to ukljucuje i subfoldere sa svim fajlovima i to na vise nivoa, dakle bas sve)

Pokusao sam sa listingom, i par drugih metoda ali nijedan metod mi nije 100% dobar. Da li postoji neko jednostavno resenje?

Hvala.
[ anon68680 @ 26.10.2005. 19:18 ] @
MISLIM da postoji nesto kao IdFTP1.directorylisting.delete(indexdira) ili tako neka funkcija...
[ freespace @ 27.10.2005. 19:41 ] @
hvala, uspio sam