![]() |
Re: IdFTP + progressbar wie ?!
aha, da stellen sich mir nur 2 fragen. :gruebel:
1.Wie komm ich an das directory listing? 2.Wie bekomme ich die größe daraus? :roll: |
Re: IdFTP + progressbar wie ?!
Schon mal die Demos zu den Indy Komponenten angeguckt? Da sollte ein kompletter FTP Client dabei sein.
|
Re: IdFTP + progressbar wie ?!
Ja, hab ich , aber da kommt dann ein fehler das eine unit, die unter uses eingetragen ist, mit einer anderen version kompiliert wurde....
|
Re: IdFTP + progressbar wie ?!
Ja und? Du sollst dir ja nur die entsprechenden Stellen im Sourcecode angucken. Kompilieren können musst du doch gar nicht.
|
Re: IdFTP + progressbar wie ?!
Guten Morgen.
Bei einer vorkonfigurierten FTP Client-Komponente (host, username, password) hilft manchmal auch schon das hier weiter:
Delphi-Quellcode:
Grüße vom marabu
function FTPSize(ftp: TIdFTP; const fn: TFileName): Int64;
begin ftp.Connect(true, -1); try try Result := ftp.Size(fn); except Result := 0; end; finally ftp.Disconnect; end; end; |
Re: IdFTP + progressbar wie ?!
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:
Man kanns noch optimieren. Wer Ideen hat immer gerne.
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; |
AW: IdFTP + progressbar wie ?!
Hallo,
der Beitrag ist zwar schon etwas älter, aber ich hätte hierzu mal noch eine Frage... Der Source funktioniert bei mir nur wie folgt:
Delphi-Quellcode:
Wie man sieht verwende ich im Moment zwei FTP Komponenten.
//******************************************************************************
// FTP Download with Progressbar * //****************************************************************************** procedure TForm1.Button20Click(Sender: TObject); begin //Get File Size Try FTP.Host := 'Server'; FTP.Username := 'User'; FTP.Password := 'Password'; FTP.Connect; FTP.ChangeDir('/Folder1/Folder2/'); giFileSize := FTP.Size('setup.exe'); FTP.Disconnect; Except FTP.Free; Exit; End; //Download File Try FTPDownload.Host := 'Server'; FTPDownload.Username := 'User'; FTPDownload.Password := 'Password'; FTPDownload.Connect; FTPDownload.ChangeDir('/Folder1/Folder2/'); FTPDownload.Get('setup.exe', 'C:\Temp\setup.exe', True); FTPDownload.Disconnect; Except FTPDownload.Free; Exit; End; end; procedure TForm1.FTPDownloadWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin with FTPProgress do begin Max := giFileSize; Position := 0; Visible := true; end; end; procedure TForm1.FTPDownloadWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin with FTPProgress do Position := Integer(AWorkCount); end; procedure TForm1.FTPDownloadWorkEnd(ASender: TObject; AWorkMode: TWorkMode); begin with FTPProgress do Visible := false; end; Dies liegt daran da ich die File Größe erst ermittle und dann über die zweite den Download Starte. Ich habe erst versucht beides über eine FTP Komponente zu machen, aber da hat er mir dann beim File Size ermitteln die OnWork / OnBeforeWork Aktionen ausgeführt. Meine Frage daher, kann man es steuern wann er die OnWork / OnBeforeWork Ereignisse aufruft oder nicht? |
AW: IdFTP + progressbar wie ?!
Du könntest natürlich die Events beim GetSize abhängen (z.B.
Delphi-Quellcode:
) und beim get wieder anhängen (z.B.
FTP.DownloadWorkBegin:=nil;
Delphi-Quellcode:
)
FTP.DownloadWorkBegin:=FTPDownloadWorkBegin;
oder über eine Variable die ausgabe steuern (beim GetSize einen Boolean auf True setzen und in den Events
Delphi-Quellcode:
).
if x then Exit;
AWorkCountMax hat dir nicht gefallen?
Delphi-Quellcode:
//******************************************************************************
// FTP Download with Progressbar * //****************************************************************************** procedure TForm1.Button20Click(Sender: TObject); begin Try FTPDownload.Host := 'Server'; FTPDownload.Username := 'User'; FTPDownload.Password := 'Password'; FTPDownload.Connect; FTPDownload.ChangeDir('/Folder1/Folder2/'); FTPDownload.Get('setup.exe', 'C:\Temp\setup.exe', True); FTPDownload.Disconnect; Except FTPDownload.Free; // wieso Free? (sei froh, daß dir TComponent die Form-Variable FTPDownload "zufällig" auf nil setzt, wenn sie published ist) Exit; End; end; procedure TForm1.FTPDownloadWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin with FTPProgress do begin Max := AWorkCountMax; Position := 0; Visible := true; end; end; procedure TForm1.FTPDownloadWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin with FTPProgress do Position := AWorkCount; end; procedure TForm1.FTPDownloadWorkEnd(ASender: TObject; AWorkMode: TWorkMode); begin with FTPProgress do Visible := false; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz