Fehler beim Herunterladen mehrerer Dateien (FTP) - [Gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von Achtzig »

FtpGetFile ist nicht für den Download mehrerer Dateien gedacht. TFTPSend (was von FtpGetFile genutzt wird) gibt auch Booleanwerte zurück. Darüber hinaus wird auch der Status mitgeliefert, was bei FtpGetFile/FtpPutFile nicht der Fall ist. Außerdem kann die Übertragung verschlüsselt werden (soweit der Server das unterstützt).

Abgesehen davon, ist das FTP-Problem schon gelöst. Jetzt geht es um einen anderen Fehler ;)

@mark332: Apropo Rückgabewert. Du solltest besser den Rückgabewert von FTPLogin beachten, falls es mal Probleme mit der Verbindung geht. Außerdem solltest Du am Schluß noch FTPLogout aufrufen.

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von Ralph59 »

Sorry,
wollte mich nicht einmischen. :oops:
:!: Ich gebe Dir vollkommen recht und wer den Beitrag komplett liest, der ist deutlich im Vorteil.

Natürlich eignet sich FtpGetFile und FtpPutFile ausschließlich für einzelne Dateien. Bei einem meiner Programme synchronisiere ich mehrere 100000 Dateien mit einem Server. Dabei wäre es fatal alles einzeln durchzuführen und nicht alles auch zu überwachen. Deshalb ist es wichtig Rückgabewerte auch zu verwenden.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

Ok, ich hab den Code jetzt entsprechend der Vorschläge ein wenig abgeändert (mit |!| markiert), allerdings ist mein Problem leider immernoch nicht gelöst...
( Error: ListIndex(11) Out of Bounds Exeption )

Der entsprechende Codeteil:

Code: Alles auswählen

 
procedure TForm1.Button_performInstalClick(Sender: TObject);
// (...)
// (...)
Sleep(500);
MaxCurSteps:= dest.Count;
Step:=2;
ProgressBar_download.Max:=MaxCurSteps-1;
if FTPLogin('***','***','mark332.bplaced.net','21') = true then // ----------|!|----------
begin                                                                      // ----------|!|----------
 
for i:=0 to MaxCurSteps-1 do
begin
 
 
Memo_step.Lines.Add ('');
if i = 4 then
 begin
 Memo_step.Lines.Add('Downloading '+recs[i]+' || This will take a while! ||');
 end
else
begin
Memo_step.Lines.Add('Downloading '+recs[i]);
end;
 
FTPDownload('source/'+recs[i],InstalDir+'\'+dest[i]);
Memo_step.Lines.Add('Extracting '+dest[i]);
Sleep(500);
 
CurStep:=i+1;
captions:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(CurStep)+'/'+IntToStr(MaxCurSteps)+')';
StaticText_download.caption:=captions;
ProgressBar_download.position:=CurStep;
end;
 
FTPLogout;            // ----------|!|----------
failes:=false;
end                       // ----------|!|----------
else                      // ----------|!|----------
begin                    // ----------|!|----------
failes:=true;         // ----------|!|----------
end;                     // ----------|!|----------
 
if (failes=true) then
 begin
 ShowMessage('Es ist ein Fehler aufgetreten, setze Installation zurück!');
 Sleep(500);
 rmDir(InstalDir);
 
 if FileExists('resource.txt') then
  begin
  DeleteFile('resource.txt')
  end;
if FileExists('destination.txt') then
 begin
 DeleteFile('destination.txt')
 end;
if FileExists('dirs.txt') then
 begin
 DeleteFile('dirs.txt')
 end;
 Application.Terminate;
 end;
 
 
if not (failes=true) then
 begin
 ShowMessage('Erfolgreich installiert!');
 Button_prev.Enabled:=false;
 x:=x+1;
 LockExit:=false;
end;
end;
Zuletzt geändert von mark332 am Di 18. Jun 2013, 19:48, insgesamt 1-mal geändert.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von gocher »

Tut mir leid aber Dein Code ist dermaßen schlecht strukturiert, da komme ich beim Lesen schon ins grübeln ob Du überhaupt noch weißt wo Du dich befindest, warum setzt Du nicht MaxCurSteps über recs.Count (MaxCurSteps := recs.Count;), wieso setzt Du ProgressBar_download.Max:=MaxCurSteps-1; wo doch am Ende ProgressBar_download.position:=CurStep; der wiederum CurStep:=i+1; und somit am Ende einen Wert von MaxCurSteps erreicht???
Bei solchen Fehlern kann die Debug-Funktion von Vorteil sein, setze doch einen Breakpoint in die Schleife und überprüfe Deine Werte!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

gocher hat geschrieben:Tut mir leid aber Dein Code ist dermaßen schlecht strukturiert, da komme ich beim Lesen schon ins grübeln ob Du überhaupt noch weißt wo Du dich befindest, warum setzt Du nicht MaxCurSteps über recs.Count (MaxCurSteps := recs.Count;), wieso setzt Du ProgressBar_download.Max:=MaxCurSteps-1; wo doch am Ende ProgressBar_download.position:=CurStep; der wiederum CurStep:=i+1; und somit am Ende einen Wert von MaxCurSteps erreicht???
Bei solchen Fehlern kann die Debug-Funktion von Vorteil sein, setze doch einen Breakpoint in die Schleife und überprüfe Deine Werte!
1. Ob ich MaxCurSteps über dest.Count oder recs.Count setze ist egal ;) , weil beides den selben Wert ausgibt.
2. Das mit der ProgressBar_download.position:=CurStep , die dann über den Wert "Max" kommt, ist ein guter Hinweis, Danke :) (ich schau mal, obs daran liegt)
3. Breakpoints habe ich noch nie ausprobiert, also werd' ich das jetzt mal testen, auch hier Danke :)
4. Ja, ich verstehe meinen Code selbst, aber ich behaupte nicht, dass andere da Durchblick haben ;)

MfG mark332

Danke, ich teste jetzt mal obs geht und schreib' dann das Ergebnis :)



Edit: Ok, getestet und leider besteht der Fehler noch immer ... :(

Zum besseren Verständnis meines Codes für andere ;) :

Code: Alles auswählen

 
Der Installer lädt 3 Dateien runter, in denen 1. Zu erstellende Ordner...  2. Die Namen der herunterzuladenden Dateien... und 3. Die lokalen Namen der heruntergeladenen Dateien ...stehen.
 
Das Programm soll die drei Dateien auslesen und in eine TStringList ablegen.
 
Jetzt sollen die genannten Ordner (TStringList: dirs) erstellt werden (klappt auch schon ;) )
 
Danach sollen die ursprünglichen Dateien (TStringList: recs) vom FTP heruntergeladen werden und als neue, lokale Dateien (TStringList: dest) gespeichert werden.
 
Schlägt der Download fehl, sollen vorherige Schritte rückgängig gemacht werden.
 
Ich hoffe das hilft euch dabei, mir zu helfen :oops:

MfG mark332

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von Achtzig »

Ich habe Dir gerade eine PM geschickt. Weiß aber nicht, ob Du die auch bekommst, da sie im Ordner "Postausgang" verbleibt und nicht unter "Gesendete Nachrichten" erscheint. Kenne mich mit den PMs hier im Forum nicht aus und weiß nicht, ob "gesendet" eher "hat empfangen" bedeutet ;)

Wenn Du keine PM erhalten hast, sage mir doch bitte Bescheid.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

Achtzig hat geschrieben:Ich habe Dir gerade eine PM geschickt. Weiß aber nicht, ob Du die auch bekommst, da sie im Ordner "Postausgang" verbleibt und nicht unter "Gesendete Nachrichten" erscheint. Kenne mich mit den PMs hier im Forum nicht aus und weiß nicht, ob "gesendet" eher "hat empfangen" bedeutet ;)

Wenn Du keine PM erhalten hast, sage mir doch bitte Bescheid.
Jup erhalten, auch wenns keine Problemlösung war xD ... , Danke für den Hinweis ;) :D :D

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von Achtzig »

Jo, wäre aber auch gemein, eine Lösung per PM zu schicken wenn die Frage im Forum gestellt wird :wink:

Zu Deiner PM kann ich nur sagen, nehme es nicht zu leicht. Auch ohne Adminrechte kann man eine Menge Unfug anstellen, für die Du dann gerade stehen mußt. Und die Daten waren lange genug sichtbar 8)

Zumindest weiß ich jetzt, daß "gesendet" tatsächlich "hat gelesen" bedeutet. Nun ist die PM nämlich in "gesendet".

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

Achtzig hat geschrieben:Jo, wäre aber auch gemein, eine Lösung per PM zu schicken wenn die Frage im Forum gestellt wird :wink:

Zu Deiner PM kann ich nur sagen, nehme es nicht zu leicht. Auch ohne Adminrechte kann man eine Menge Unfug anstellen, für die Du dann gerade stehen mußt. Und die Daten waren lange genug sichtbar 8)

Zumindest weiß ich jetzt, daß "gesendet" tatsächlich "hat gelesen" bedeutet. Nun ist die PM nämlich in "gesendet".
Jo, schon passiert, was passieren muss ums zu verhindern :D
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von Achtzig »

Gut :)
mark332 hat geschrieben: 4. Ja, ich verstehe meinen Code selbst, aber ich behaupte nicht, dass andere da Durchblick haben
Das ist aber spätestens dann ein Problem, wenn man Hilfe von den Anderen braucht. Ein halbwegs aufgeräumter Quelltext ist da wirklich sehr hilfreich :wink:

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

@Achtzig Naja, deswegen hab' ich eine Algemeinfassung geschrieben, was getan werden soll, ich werde vmtl. morgen aber nochmal eine Version posten, wo ich erkläre, was was machen soll ... ;)

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von shokwave »

Hi,

wo der Fehler nun genau liegt, kann ich dir leider nicht sagen, aber ich habe mir aus den Codeschnipseln hier ein lauffähiges Projekt gebastelt, welches funktioniert. Dabei sind mir ein paar Dinge aufgefallen.

1. Du hattest/hast da einen Schreibfehler bei der "resource.txt" drin (die hieß "recource.txt" und hatte nur 11 Zeilen). Prüf nochmal deinen Code. Am besten löschst du auch die Datei.
2. Um die Textdateien zu laden benutzt du AssignFile, ReadLn... Einfacher gehts mit

Code: Alles auswählen

recs.LoadFromFile('resource.txt');
Außerdem hab ich gesehen, das deine Textdateien nur ein 0x0A (LF), als Zeilenende, verwenden. Das musst du der StringList mit

Code: Alles auswählen

recs.TextLineBreakStyle:=tlbsLF;
sagen, sonst ist die ganze Datei in einer Zeile.
3. Die Dateien "resource.txt" und "destination.txt" sind ja identisch, da brauchst du auch nur eine davon zu verwenden.
4. Die Dateien "Minecraft Multilauncher.exe" und "Minecraft_Multilauncher_Setup.exe" sind ziemilch groß. Du kannst sie vor dem hochladen mit dem Befehl

Code: Alles auswählen

strip -s *.exe
signifikant verkleinern.

In meinem Testprojekt habe ich die Punkte 1 -3 berücksichtigt und wegen der Übersicht die FTP-Funktionen von Achtzig in eine separate Unit gepackt.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls, ExtCtrls, synutils;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Memo_step: TMemo;
    Panel1: TPanel;
    ProgressBar_download: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
    InstalDir:String;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  MaxCurSteps, Step, i: Integer;
  failes: Boolean;
  dirs: TStringList;
  recs: TStringList;
begin
  InstalDir:='C:\Temp\Test';    //Verzeichnis zum testen
  dirs:= TStringList.create;
  recs:= TStringList.create;
 
  Memo_step.Lines.Add('Lese Dateien ein...');
  application.ProcessMessages;    //aktualisiert das Fenster
 
  // Dateien einlesen
  recs.LoadFromFile('resource.txt');  //einfacher als mit Files, AssignFile...
  recs.TextLineBreakStyle:=tlbsLF;  //deine Dateien haben nur 0x0A als Zeilenende
  dirs.LoadFromFile('dirs.txt');
  dirs.TextLineBreakStyle:=tlbsLF;
 
  MaxCurSteps := dirs.Count;
  ProgressBar_download.Max := MaxCurSteps;
 
  //Ordner erstellen
  for i:=0 to (MaxCurSteps-1) do
  begin
    //GUI
    Memo_step.Lines.Add('Erstelle Verzeichnis "'+dirs[i]+'"');
    caption := 'Installiere... : Schritt 1/2 ('+IntToStr(i+1) + '/' + IntToStr(MaxCurSteps) + ')';
    ProgressBar_download.position := i+1;
    application.ProcessMessages;
    //Aktion
    ForceDirectories(InstalDir+PathDelim+dirs[i]);
  end;
 
  MaxCurSteps:= recs.Count;
  Step:=2;
  ProgressBar_download.Max:=MaxCurSteps-1;
  failes:=false;
 
  //Download
  if FTPLogin('mark332.bplaced.net','21','name','passwort') then
  begin
    for i:=0 to MaxCurSteps-1 do
    begin
      //GUI
      Memo_step.Lines.Add('Download von "'+recs[i]+'"');
      caption:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(i+1)+'/'+IntToStr(MaxCurSteps)+')';
      ProgressBar_download.position:=i+1;
      application.ProcessMessages;
      //Aktion
      FTPDownload('source/'+recs[i], InstalDir+PathDelim+recs[i]); //da resource.txt und destination.txt identisch sind, verwende ich nur eine davon
    end;
    FTPLogout;
  end else
  begin
    failes:=true;
  end;
 
  if failes then
  begin
    ShowMessage('Es ist ein Fehler aufgetreten, setze Installation zurück!');
    //rmDir funtioniert nur bei leeren Ordnern
  end else
  begin
    ShowMessage('Erfolgreich installiert!');
  end;
end;
 
end.
 

Code: Alles auswählen

unit synutils;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, ftpsend;
 
procedure FtpLogout;
function FtpLogin(const IP, Port, User, Pass: string): Boolean;
function FtpDownload(const FileName, LocalFile: string): Boolean;
 
var FtpInstance :TFTPSend = Nil;
 
implementation
 
function FtpLogin(const IP, Port, User, Pass: string): Boolean;
begin
  Result:=False;
  FtpInstance:=TFTPSend.Create;
  with FtpInstance do
  try
    if User <> '' then
    begin
      Username := User;
      Password := Pass;
    end;
    TargetHost := IP;
    TargetPort := Port;
    Result:=Login;
    if not Result then Free;
  except
    Free;
  end;
end;
 
function FtpDownload(const FileName, LocalFile: string): Boolean;
begin
  with FtpInstance do begin
    DirectFileName := LocalFile;
    DirectFile:=True;
    Result := RetrieveFile(FileName, False);
  end;
end;
 
procedure FtpLogout;
begin
  FtpInstance.Logout;
  FtpInstance.Free;
end;
end.
 
Ich hoffe das hilft dir weiter.
mfg Ingo

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

Cool danke für die schnelle AW :) , das werde ich morgen gleich mal probieren :D

MfG mark332

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von mark332 »

Danke an shockwave ! ;D deine Eher nebenbei geschriebene Bemerkung wegen des Dateinamens der resource.txt hat mein Problem behoben :DDD


Ich werde das Topic jetzt als [Gelöst] schreiben, danke an Alle, die geantwortet haben (besonderen Dank an Achtzig und shockwave),

allerdings habe ich noch eine Frage an shockwave... : Was genau meinst du mit "strip -s *.exe" , ich hab schon versucht mich über google schlau zu machen, habe aber nichts gefunden ... wäre schön, wenn du mir ein Beispiel, oder einen Link schicken könntest das/der das Ganze erklärt... :oops:
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Fehler beim Herunterladen mehrerer Dateien (FTP) ?!

Beitrag von shokwave »

Hallo Mark,

freut mich das du den Fehler gefunden hast.

Zu deiner Frage: strip ist ein Kommandozeilenprogramm, welches die Debuginformationen aus deinem Programm entfernt. Diese werden nur benötigt, wenn dein Programm mit einem Debugger läuft (z.B. wenn es mit Lazarus gestartet wurde) und du auf Fehlersuche bist.

Die Strip.exe sollte schon auf deinem Rechner sein und sich bei den ganzen anderen FPC-Programmen befinden(z.B. C:\fpc\bin\i386-win32).
Als Lesetipp über die Größe deiner Programmdatei kann ich dir http://wiki.lazarus.freepascal.org/Size_Matters/de empfehlen.

Wenn du allgemein mit Kommandozeile nichts anzufangen weist, dann hilft dir vielleicht http://www.carpelibrum.de/tutorials/windows_konsole.pdf.

Viel Erfolg mit deinem Projekt.
mfg Ingo

Antworten