Einzelnen Beitrag anzeigen

Benutzerbild von TheProfi
TheProfi

Registriert seit: 30. Mai 2005
Ort: Emden
42 Beiträge
 
Delphi 10.3 Rio
 
#16

Re: IdFTP + progressbar wie ?!

  Alt 4. Mai 2010, 13:51
Hi,

ich habs so gelöst und es geht. Dieser Programmcode stammt von meinem Programmupdater (D2010, akt. Indy 10.5.7).
Mit dieser Function lade ich alle Dateien runter die in einem bestimmten Verzeichnis liegen.

Version : ist halt ein Verzeichnis auf dem FTPServer
Pfad : ist halt ein weiteres Verzeichnis auf dem FTPServer
LStatus1 : gibt die als Text "Download Datei x von y"
LStatus2 : gibt die aktuelle Datei mit Dateigöße zurück
PB : 0 bis Anzahl Dateien im Verzeichnis
PB2 : aktueller Downloadverlauf der jeweiligen Datei

Delphi-Quellcode:
Function DownloadFiles(Version,pfad : String; var ftp : TIdFTP; var LStatus1,LStatus2 : TADVSmoothLabel; var pb,pb2 : TADVProgressBar) : boolean;
var zielverzeichnis : string;
    dateiliste : TStringlist;
    i : Integer;
begin
  pb.position := 0;
  pb2.Position := 0;
  pb2.Visible := true;
  LStatus2.Visible := true;
  if FTP.Connected then
    ftp.Disconnect
  else begin
    FTP.Username := 'dein Accountname';
    FTP.Password := 'dein Passwort';
    FTP.Host := 'URL';

    FTP.TransferType := ftBinary; //ftASCII;
    FTP.Connect;
    FTP.ChangeDir('updates');
    FTP.ChangeDir(version);
    FTP.ChangeDir(pfad);

    zielverzeichnis := (extractfiledir(paramstr(0))+pfadinstall+'\'+version+'\'+pfad);
    if not DirectoryExists(zielverzeichnis) then ForceDirectories(zielverzeichnis);
    dateiliste := Tstringlist.Create;
    FTP.List(dateiliste,'*.*',False);
    pb.Max := dateiliste.Count;
    dateiliste.SaveToFile(zielverzeichnis+'\'+version+'.txt');
    //Dateiliste herunterladen
    for i := 0 to dateiliste.Count - 1 do begin
      StatusSchreiben(dateiliste[i],4,f_status.M_Status); //ist eine Procedure die eine Infozeile in ein Memo schreibt
      LStatus1.Caption.Text := 'Download Datei '+inttostr(i+1)+' von '+inttostr(dateiliste.Count);
      LStatus2.Caption.Text := 'Aktueller Download: '+ dateiliste[i] +'('+inttostr(FTP.Size(dateiliste[i]))+' Bytes)';
      PB2.Max := FTP.Size(dateiliste[i]);
      FTP.Get(dateiliste[i],zielverzeichnis+'\'+dateiliste[i],True); //Dateiholen und überschreiben
      pb.Position := i+1;
      pb.Refresh;
    end;
    dateiliste.Free;
    FTP.Disconnect;
  end;
  pb2.Visible := false;
  LStatus2.Visible := false;
  DownloadFiles := true;
end;

procedure TFMain.FTPWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  pb_3.Position := AWorkcount;
  pb_3.Refresh;
end;

procedure TF_INUpdate.FTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  pb_3.Position := 0;
  pb_3.Refresh;
end;

procedure TMain.bt_startenClick(Sender: TObject);
var DBVersionGefunden : boolean;
    zielverzeichnis : string;
begin
  if DownloadFiles('3730','db',ftp,L_Status_2,L_Status_3,pb_2,pb_3) then begin
      //...
    end;
  end;
end;
Man kanns noch optimieren. Wer Ideen hat immer gerne.
Georg Reimann
------------------------------------------------------
Sicher ist nur eines, dass nichts sicher ist...
  Mit Zitat antworten Zitat