Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idFTP - Listbox-multiselect download - Wie? (https://www.delphipraxis.net/26311-idftp-listbox-multiselect-download-wie.html)

DRPEnc 21. Jul 2004 21:49


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:
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;
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.

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.

Luckie 21. Jul 2004 21:59

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? ;)

DRPEnc 21. Jul 2004 22:12

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:
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;
... irgendwas fehlt noch ...

Delphi-Quellcode:
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;
... hab sie noch nicht ausprobiert. Kann das überhaupt funktionieren?

S - tefano 21. Jul 2004 22:35

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?

Luckie 21. Jul 2004 22:42

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. ;)

DRPEnc 21. Jul 2004 22:43

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).

Luckie 21. Jul 2004 22:49

Re: idFTP - Listbox-multiselect download - Wie?
 
Würde es so machen: (Pseudocode)
Code:
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;
  ...;
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.

DRPEnc 22. Jul 2004 10:13

Re: idFTP - Listbox-multiselect download - Wie?
 
Hi Luckie.

Ich hab mal versucht Deinen Code einzubauen.

Irgendwie stimmts vorn und hinten nicht:

Delphi-Quellcode:
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 hoffe, das wenigstens die Funktion richtig ist. Der Downloadbefehl passt noch nicht.
Ich muss in diese Zeile den Integer einbauen:

Delphi-Quellcode:
Name := IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
Ich bekomme jetzt immer folgende Fehlermeldungen:

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 ...

DRPEnc 23. Jul 2004 21:34

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 IndyDemos.

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 ...

supermuckl 23. Jul 2004 22:00

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:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz