![]() |
idFTP - Listbox-multiselect download - Wie?
Ich baue an einem FTP-Client.
Nun hänge ich an dem Multiselect-Download fest. Meine Downloadbefehle sind bis jetzt folgende:
Delphi-Quellcode:
DirectoryListBox.Items währe die Liste des Inhalts vom Server. Downloaden von den einzelnen Dateien ist möglich. Nun will ich aber erreichen, dass der User alle Dateien, die er benötigt zu markieren und mein Programm diese dann nacheinander downloaded. Nur bin ich noch nicht draufgekommen, wie ich das anstellen soll.
procedure TMainForm.DirectoryListBoxDblClick(Sender: TObject);
Var Name, Line : String; begin if edit4.text ='' then exit; if not IdFTP1.Connected then exit; Line := DirectoryListBox.Items[DirectoryListBox.ItemIndex]; if checkbox1.checked then begin Name := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName+spezial.text end else Name := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName; if IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory then begin //Change directory SetFunctionButtons(false); ChageDir(Name); SetFunctionButtons(true); end else begin try SaveDialog1.FileName := Name; savedialog1.InitialDir := edit4.text; if SaveDialog1.Execute then begin SetFunctionButtons(false); IdFTP1.TransferType := ftBinary; BytesToTransfer := IdFTP1.Size(Name); if FileExists(Name) then begin case MessageDlg('Datei existiert bereits. Willst Du mit dem Download weitermachen?', mtConfirmation, mbYesNoCancel, 0) of mrYes: begin BytesToTransfer := BytesToTransfer - FileSizeByName(Name); IdFTP1.Get(Name, SaveDialog1.FileName, false, true); end; mrNo: begin IdFTP1.Get(Name, SaveDialog1.FileName, true); end; mrCancel: begin exit; end; end; end else begin IdFTP1.Get(Name, SaveDialog1.FileName, false); end; end; finally SetFunctionButtons(true); end; end; end; Was ich bis jetzt gemacht habe: Die Variable Name ist das zur Zeit markierte Item von der DirectoryListBox. Das InitialDir = edit4.text. Der User kann somit das Downloadverzeichnis festlegen. Somit könnte ich z.B. folgenden Code anwenden: IdFTP1.get(Name, Edit4.text+Name2, false); Nur fehlt mir eine Routine, das nach Beendigung des Downloads der aktuellen Datei die nächste anschließend downgeloaded wird. |
Re: idFTP - Listbox-multiselect download - Wie?
Nun ja. Wie wäre es die ausgewählten Einträge der Listbox in einer Schleife durch zu gehen und nach ein ander runter zu laden? ;)
|
Re: idFTP - Listbox-multiselect download - Wie?
Das ist eine Möglichkeit.
Nur weis ich noch nicht, wie ich die markierten Dateien nacheinander downloade. Sie stehen ja schon in einer Listbox. Ich müsste die Items warscheinlich in eine andere Listbox umkopieren und diese abarbeiten, oder liege ich falsch. Ich durchsuche das Forum, vielleicht finde ich was passendes.
Delphi-Quellcode:
... irgendwas fehlt noch ...
for i:=0 to listbox1.items.count-1 do
begin IdFTP1.TransferType := ftBinary; BytesToTransfer := IdFTP1.Size(listbox1.items[i]); IdFTP1.Get(listbox1.items[i], SaveDialog1.FileName, true); end;
Delphi-Quellcode:
... hab sie noch nicht ausprobiert. Kann das überhaupt funktionieren?
for i := 0 to ListBox1.Items.Count - 1 do begin
if ListBox1.Selected[i] then begin IdFTP1.TransferType := ftBinary; BytesToTransfer := IdFTP1.Size(listbox1.items[i]); IdFTP1.Get(listbox1.Selected[i], SaveDialog1.FileName, true); end; |
Re: idFTP - Listbox-multiselect download - Wie?
So viel Ahnung hab ich von den Indies nicht, aber könnte man vielleicht versuchen für jede Datei nen eigenen Downloadthread aufzumachen dass die parallel laufen? Geht das mit den Indies?
|
Re: idFTP - Listbox-multiselect download - Wie?
Wieso umkopieren? Frag doch ab, ob der Eintrag ausgewählt ist und wenn ja dann lädst du es runter. Das mit den Threads würde ich erstmal lassen. Kann man ja immer noch machen, wenn man es erstmal so geschafft hat. Und wenn man etwas vorausschauend programmiert, dann ist das mit dem Thread in 10 Minuten implementiert. ;)
|
Re: idFTP - Listbox-multiselect download - Wie?
DAs mit dem Umkopieren war nur so ein Gedanke.
Kann ich was mit meinen Ansätzen irgendwas anfangen? (Sind im zweiten Post). |
Re: idFTP - Listbox-multiselect download - Wie?
Würde es so machen: (Pseudocode)
Code:
Und wenn du es dann in einem Thread haben willst startest du den Thread in der Schleife und rufst in der Thread-Funktion einfach DownloadFile auf.
function DownloadFile(const SrcFilename, DestFilename: String);
begin IdFTP:get(...); end; procedure ButtonClick; var ...; begin ...; for i := 0 to Listbox1.Items.Count - 1 do begin if Listbox1.Items[i].Selected then DownloadFile(SeverPath+Listbox1.Items.Strings[i], Localpath+Listbox1.Items[Strings[i]); end; ...; |
Re: idFTP - Listbox-multiselect download - Wie?
Hi Luckie.
Ich hab mal versucht Deinen Code einzubauen. Irgendwie stimmts vorn und hinten nicht:
Delphi-Quellcode:
Ich hoffe, das wenigstens die Funktion richtig ist. Der Downloadbefehl passt noch nicht.
function TMainForm.DownloadFile(const SrcFilename, DestFilename: String):String;
begin IdFTP1.TransferType := ftBinary; BytesToTransfer := IdFTP1.Size(SrcFilename); if FileExists(SrcFilename) then begin case MessageDlg('Datei existiert bereits. Willst Du mit dem Download weitermachen?', mtConfirmation, mbYesNoCancel, 0) of mrYes: begin BytesToTransfer := BytesToTransfer - FileSizeByName(SrcFilename); IdFTP1.get(SrcFilename, DestFilename, false, true); end; mrNo: begin IdFTP1.get(SrcFilename, DestFilename, true); end; mrCancel: begin exit; end; end; end else begin IdFTP1.get(SrcFilename, DestFilename, false); end; end; procedure TMainForm.DirectoryListBoxDblClick(Sender: TObject); var Name, Line : String; i: integer; begin Name := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName; for i := 0 to Listbox1.Items.Count - 1 do begin if DirectoryListBox.Selected[i] then DownloadFile(Name, Edit4.text+'\'+Name); end; end; Ich muss in diese Zeile den Integer einbauen:
Delphi-Quellcode:
Ich bekomme jetzt immer folgende Fehlermeldungen:
Name := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
Listindex out of bounds (20) bzw dass die Datei schon existiert, wenn ich sie nochmal runterlade. Ergo greift die Funktion irgendwie noch nicht richtig ... Ich hatte auch ne Schleife hinbekommen, aber diese funktionierte nicht. Es wurde nichts herruntergeladen und sie hörte nicht auf. Da ich noch ein Schleifen-Noob bin muss ich mir die Schleifen genauer ansehen ... |
Re: idFTP - Listbox-multiselect download - Wie?
Ich hab mich nochmal an den Computer gesetzt, aber nichts im Internet gefunden.
Mein FTP-Client basiert auf den ![]() Ich kann Luckies pseudo-Code leider irgendwie dort nicht einbauen. Es währe schön, wenn man mehre Dateien nacheinander downloaden kann. Ich dreh mich irgendwie im Kreis. Bei mir hagelts nur noch Fehlermeldungen. Vielleicht findet einer von Euch ne Lösung. Ich such weiter im Netz ... |
Re: idFTP - Listbox-multiselect download - Wie?
das ftp protocol ist nicht geschaffen für multi downloading
das heist es muss jeder download thread sich jeweils selbst einloggen und das wird bei den meisten servern probleme geben da multibles einloggen von derselben IP oft gesperrt ist.. bzw userlimit herrscht.. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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