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

Für Fragen von Einsteigern und Programmieranfängern...
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 »

@Achzig

Dankee :DD , eine etwas von mir abgewandelte Form deines Codes, hat mein Problem behoben. :D

Danke nochmal ;)

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 »

Gerne :)

Nebenbei bemerkt hat die Achtzig was mit Acht zu tun, weswegen normalerweise auch ein t vor dem zig kommt. Aber egal. Das t wird von vielen ignoriert :wink:

Wenn noch funktionale Fehler in dem Beispiel-Quelltext waren, wäre es gut, wenn Du noch die funktionierende Version hier einstellst. Falls es nochmal gebraucht werden sollte.

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 »

Fehler an sich waren nur hier:

Code: Alles auswählen

 
function FTPLogout;
begin
  FtpInstance.Logout;
  FtpInstance.Free;
end;
müsste sein:

Code: Alles auswählen

 
function FTPLogout: Boolean;
begin
  Result:=false;
  FtpInstance.Logout;
  FtpInstance.Free;
  Result:=true;
end;
ansonsten hab ich das nur so geändert, dass ichs in 3Monaten auch noch verstehe ;)
------------------------------------------------------------
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 »

Ne, so geht das nicht :wink:

Result kannst Du da weglassen. Wenn schon, mußt Du mit try except arbeiten sonst macht das keinen Sinn.

Ich bin einfach davon ausgegangen, daß Logout keine Ausnahme wirft, also als Beispiel. Natürlich kann man da noch try except einbauen, wie auch in FtpDownload. Dann wäre es sauberer.

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 »

Naja, das Problem war, dass der Compiler Ausgeworfen hat: " ':' Exepted but ';' found... ich habs einfach so geschrieben und es geht auch, also... :DD
------------------------------------------------------------
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 »

FtpLogout war eine Procedure - keine Function :wink:

Aber schön, wenn Du nicht alles mit Copy und Paste machst.

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..... jemand ne Ahnung, weswegen ich hier bekomme "EStringList (2) Out of Bounds Exeption" ?

Code: Alles auswählen

 
procedure TForm1.Button_performInstalClick(Sender: TObject);
{  dirs: TStringList;
  recs: TStringList;
  dest: TStringList; }
var
  MaxCurSteps: Integer;
  Step: Integer;
  CurStep: Integer;
  captions: String;
  failes: Boolean;
  str: String;
  i: Integer;
 
  File1,File2,File3: TextFile;
//----------------------------//
begin
 
dirs:= TStringList.create;
recs:= TStringList.create;
dest:= TStringList.create;
 
 
AssignFile(File1,'recource.txt');
AssignFile(File2,'dirs.txt');
AssignFile(File3,'destination.txt');
 
// Files auslesen
   Reset(File1);
 repeat
    Readln(File1,str);
    recs.Add(str);
 until (EOF(File1));
    CloseFile(File1);
//-----------------------------//
Reset(File2);
 repeat
    Readln(File2,str);
    dirs.Add(str);
 until (EOF(File2));
    CloseFile(File2);
//-----------------------------//
Reset(File3);
repeat
   Readln(File3,str);
   dest.Add(str);
until (EOF(File3));
    CloseFile(File3);
 
    StaticText_download.visible:=true;
 
MaxCurSteps:= dirs.Count-1;
Step:=1;
for i:=0 to (dirs.Count+1) do
begin
CreateDir(InstalDir+'\'+dirs[i]);
CurStep:=i+1;
captions:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(CurStep)+'/'+IntToStr(MaxCurSteps-1)+')';
StaticText_download.caption:=captions;
ProgressBar_download.Max:=MaxCurSteps-1;
ProgressBar_download.position:=CurStep;
end;
 
MaxCurSteps:= dest.Count-1;
Step:=2;
 
FTPLogin(***,***,'mark332.bplaced.net','21');
 
for i:=0 to (dest.Count-1) do
begin
 
//if                                           = true) then
FTPDownload(recs[i],InstalDir+'\'+dest[i]);
 
// begin
CurStep:=i+1;
captions:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(CurStep)+'/'+IntToStr(MaxCurSteps-1)+')';
StaticText_download.caption:=captions;
ProgressBar_download.Max:=MaxCurSteps-1;
ProgressBar_download.position:=CurStep;
// end
// else
// begin
// ShowMessage('Error occured!');
// failes:=true;;
// end;
end;
failes:=false;
 
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
 ShowMessage('Erfolgreich installiert!');
 Button_prev.Enabled:=false;
 x:=x+1;
 LockExit:=false;
end;
dirs.txt:

Code: Alles auswählen

 
Minecraft Multilauncher
Minecraft Multilauncher\temp_mcml
 
recource.txt:

Code: Alles auswählen

BVCD_win7.bat
BVCD_winXP.bat
FTB.exe
mcBVCD.jar
Minecraft Multilauncher.exe
Minecraft.exe
Minecraft_Multilauncher_Setup.exe
Settings.ini
skin.jpg
TechnicLauncher.exe
latest.jpg
destination.txt:

Code: Alles auswählen

BVCD_win7.bat
BVCD_winXP.bat
FTB.exe
mcBVCD.jar
Minecraft Multilauncher.exe
Minecraft.exe
Minecraft_Multilauncher_Setup.exe
Settings.ini
skin.jpg
TechnicLauncher.exe
latest.jpg

Danke schonmal im Voraus

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:FtpLogout war eine Procedure - keine Function :wink:

Aber schön, wenn Du nicht alles mit Copy und Paste machst.
°_0 und ^^ und Danke :DD

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 »

Code: Alles auswählen

 
procedure TForm1.Button_performInstalClick(Sender: TObject);
{  dirs: TStringList; //hast Du die StringListen global definiert [udo]
  recs: TStringList;
  dest: TStringList; }
var
  MaxCurSteps: Integer;
  Step: Integer;
  CurStep: Integer;
  captions: String;
  failes: Boolean;
  str: String;
  i: Integer;
 
  File1,File2,File3: TextFile;
//----------------------------//
begin
 
dirs:= TStringList.create;
recs:= TStringList.create;
dest:= TStringList.create;
 
 
AssignFile(File1,'recource.txt');
AssignFile(File2,'dirs.txt');
AssignFile(File3,'destination.txt');
 
// Files auslesen
   Reset(File1);
 repeat
    Readln(File1,str);
    recs.Add(str);
 until (EOF(File1));
    CloseFile(File1);
//-----------------------------//
Reset(File2);
 repeat
    Readln(File2,str);
    dirs.Add(str);
 until (EOF(File2));
    CloseFile(File2);
//-----------------------------//
Reset(File3);
repeat
   Readln(File3,str);
   dest.Add(str);
until (EOF(File3));
    CloseFile(File3);
 
    StaticText_download.visible:=true;
 
MaxCurSteps:= dirs.Count-1;
Step:=1;
for i:=0 to (dirs.Count+1) do  // hier ist wohl ein Fehler, hier sollte dirs.Count-1 stehen oder? [udo]
...
 
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 »

Ok for i:=0 to dirs.Count-1 do hat das Probolem behoben,

mein neues Problem ist, dass "ListIndex Out of Bounds (11) bekomme, wenn ich den beiden ausgelesenen Dateien auch nur eine Zeile anhänge !?
(Die Dateien haben dann 12 Zeilen)

Code: (Warum gibt es eig. die Spoiler-Funktion hier nicht?)

Code: Alles auswählen

 
procedure TForm1.Button_nextClick(Sender: TObject);
begin
x:= x+1
end;
 
procedure TForm1.Button_performInstalClick(Sender: TObject);
{  dirs: TStringList;
  recs: TStringList;
  dest: TStringList; }
var
  MaxCurSteps: Integer;
  Step: Integer;
  CurStep: Integer;
  captions: String;
  failes: Boolean;
  str: String;
  i: Integer;
 
 
  File1,File2,File3: TextFile;
//----------------------------//
begin
 Button_prev.Enabled:=false;
dirs:= TStringList.create;
recs:= TStringList.create;
dest:= TStringList.create;
Memo_step.Lines.Add('Reading relevant Files...');
 
 
Sleep(8000);
 
AssignFile(File1,'recource.txt');
AssignFile(File2,'dirs.txt');
AssignFile(File3,'destination.txt');
 
// Files auslesen
   Reset(File1);
 repeat
    Readln(File1,str);
    recs.Add(str);
 until (EOF(File1));
    CloseFile(File1);
//-----------------------------//
Reset(File2);
 repeat
    Readln(File2,str);
    dirs.Add(str);
 until (EOF(File2));
    CloseFile(File2);
//-----------------------------//
Reset(File3);
repeat
   Readln(File3,str);
   dest.Add(str);
until (EOF(File3));
    CloseFile(File3);
 
    StaticText_download.visible:=true;
 
MaxCurSteps:= dirs.Count;
Step:=1;
for i:=0 to (dirs.Count-1) do
begin
CreateDir(InstalDir);
CurStep:=i+1;
Memo_step.Lines.Add('Creating Directory cx1/2');
captions:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(CurStep)+'/'+IntToStr(MaxCurSteps)+')';
StaticText_download.caption:=captions;
ProgressBar_download.Max:=MaxCurSteps-1;
ProgressBar_download.position:=CurStep;
end;
// ---------- Mindestens bis hier ist kein Fehler aufgetreten -------------------- 
Sleep(500);
MaxCurSteps:= dest.Count;
Step:=2;
 
FTPLogin('***','***','***','***');
 
for i:=0 to dest.Count-1 do
begin
 
//if
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);
// begin
CurStep:=i+1;
captions:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(CurStep)+'/'+IntToStr(MaxCurSteps)+')';
StaticText_download.caption:=captions;
ProgressBar_download.Max:=MaxCurSteps-1;
ProgressBar_download.position:=CurStep;
// end
// else
// begin
// ShowMessage('Error occured!');
// failes:=true;;
// end;
end;
failes:=false;
 
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
 ShowMessage('Erfolgreich installiert!');
 Button_prev.Enabled:=false;
 x:=x+1;
 LockExit:=false;
end;  
Jmd. von euch 'ne Idee :D ?

MfG
mark332

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 »

ich habe mal was aufgeräumt damit man was erkennen kann!

Code: Alles auswählen

procedure TForm1.Button_nextClick(Sender: TObject);
begin
  x := x+1
end;
 
procedure TForm1.Button_performInstalClick(Sender: TObject);
{  dirs: TStringList;
  recs: TStringList;
  dest: TStringList; }
var
  MaxCurSteps, CurStep, i: Integer;
  captions, str: String;
  failes: Boolean;
  File1,File2,File3: TextFile;
begin
  Button_prev.Enabled:=false;
  dirs:= TStringList.create;
  recs:= TStringList.create;
  dest:= TStringList.create;
  Memo_step.Lines.Add('Reading relevant Files...');
 
  Sleep(8000);
 
  AssignFile(File1,'recource.txt');
  AssignFile(File2,'dirs.txt');
  AssignFile(File3,'destination.txt');
 
  // Files auslesen
  Reset(File1);
  repeat
    Readln(File1,str);
    recs.Add(str);
  until (EOF(File1));
  CloseFile(File1);
  //-----------------------------//
  Reset(File2);
  repeat
    Readln(File2,str);
    dirs.Add(str);
  until (EOF(File2));
  CloseFile(File2);
  //-----------------------------//
  Reset(File3);
  repeat
    Readln(File3,str);
    dest.Add(str);
  until (EOF(File3));
  CloseFile(File3);
 
  StaticText_download.visible:=true;
 
  MaxCurSteps := dirs.Count;
  ProgressBar_download.Max := MaxCurSteps; //die ändern sich nicht, also nicht in der Schleife
  for i:=0 to (MaxCurSteps-1) do //wenn schon eine Variable dann auch gebrauchen
  begin
    CreateDir(dirs[i]); //??? Instal?Dir ??? 
    CurStep := i + 1;
    Memo_step.Lines.Add('Creating Directory cx1/2');
    captions := 'Installiere... : Schritt 1/2 ('+IntToStr(CurStep) + '/' + IntToStr(MaxCurSteps) + ')';
    StaticText_download.caption := captions;
    ProgressBar_download.position := CurStep;
  end;
  // ---------- Mindestens bis hier ist kein Fehler aufgetreten -------------------- 
  Sleep(500);
 
  FTPLogin('***','***','***','***');
  MaxCurSteps := dest.Count;
  ProgressBar_download.Max := MaxCurSteps; //die ändern sich nicht, also nicht in der Schleife
  for i:=0 to MaxCurSteps-1 do //i wird gesetzt über dest.count !!!!
  begin
    Memo_step.Lines.Add ('');
    if i = 4 then
      Memo_step.Lines.Add('Downloading '+recs[i]+' || This will take a while! ||') //Du greifst aber auf recs zu
    else
      Memo_step.Lines.Add('Downloading '+recs[i]); //Du greifst aber erneut auf recs zu (ist recs.count=dest.count) ??? 
    FTPDownload('source/'+recs[i],InstalDir+''+dest[i]);
    Memo_step.Lines.Add('Extracting '+dest[i]);
    Sleep(500);
    CurStep := i + 1;
    captions:= 'Installiere... : Schritt 2/2 ('+IntToStr(CurStep)+'/'+IntToStr(MaxCurSteps)+')';
    StaticText_download.caption := captions;
    ProgressBar_download.position := CurStep;
  end;
  failes := false;
 
  if (failes) then // hier geht es nie hinein 
  begin
    ShowMessage('Es ist ein Fehler aufgetreten, setze Installation zurück!');
    Sleep(500);
    rmDir(InstalDir);
    if FileExists('resource.txt') then
      DeleteFile('resource.txt');
    if FileExists('destination.txt') then
      DeleteFile('destination.txt');
    if FileExists('dirs.txt') then
      DeleteFile('dirs.txt');
  end;
  Application.Terminate;
end;
 
if not (failes) then
 ShowMessage('Erfolgreich installiert!');
 Button_prev.Enabled:=false;
 x:=x+1;
 LockExit:=false;
end;
Zuletzt geändert von gocher am Mo 17. Jun 2013, 22:20, insgesamt 1-mal geändert.
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 »

Danke ;)

Um die Lösung der Problems vielleicht etwas einfacher zu machen:

Die Stelle, zu der mich der Debugger bei der Fehlermeldung sendet:

Code: Alles auswählen

Datei/Unit: control.inc

Code: Alles auswählen

 
procedure TControl.Click;
begin
  //DebugLn(['TControl.Click ',DbgSName(Self)]);
  if Assigned(FOnClick) and (Action<>nil)
  and (not CompareMethods(TMethod(Action.OnExecute),TMethod(FOnClick))) then
    // the OnClick is set and differs from the Action => call the OnClick
    FOnClick(Self)
  else if (not (csDesigning in ComponentState)) and (ActionLink <> nil) then
    ActionLink.Execute(Self)
  else if Assigned(FOnClick) then
    FOnClick(Self); //<--  Hier leitet der Debugger mich hin
end; 
 
------------------------------------------------------------
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 »

Ich habe doch eigentlich die Fehlerstelle markiert, es ist das Problem i wird gesetzt über dest.count, Du greifst aber auf recs zu, wenn nun recs kürzer ist als dest knallt es! Sind bei Dir wirklich beide Dateien gleich lang, kein CrLf mehr oder weniger!?
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 »

Beide Dateien müssten genau 12 Zeilen lang sein, es sei denn, es ist was beim Up-/Download auf/vom Ftp schiefgelaufen, ich werde das morgen mal nachschaun...

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 »

Hallo Mark332,

ich kenne Dein Problem ja nicht.
Ich benutze auch Synapse und habe damit keine Probleme.

Ich denke, dass Dein Programm noch am arbeiten ist, währende Du dem Transfer, bzw. die Dateien gnadenlos wieder löschst.
Wenn ich nur enige Dateien benötige, wie du das ja auch beschrieben hast, dann ist das eigendlich mit "FtpGetFile" recht sicher.

Zudem bekommst du noch zu jedem Transfer eine Rückmeldung:

Code: Alles auswählen

 
{:A very useful function, and example of use can be found in the TFtpSend object.
 Dowload specified file from FTP server to LocalFile.}
function FtpGetFile(const IP, Port, FileName, LocalFile,
  User, Pass: string): Boolean;
 
VAR
    cip, cVerz, cDatei, cDateiLocal, cuser, cpw : String
Begin
    //Variablen zuweisen 
    //...
 
 
// Also sollte so etwas gecht gut gehen:
    if FtpGetFile(cip, '21', './'+cVerz+'/'+cDatei, cDateiLocal, cuser, cpw) = true then begin
        // Hier habe ich in der Regel etwas Sourcecode, eintragungen in Datenbanken, LogFiles erstellen...
    end else begin
      showmessage('Achtung, konnte Die Datei nicht vom ... holen, ist das System am Netz, ist eine Verbindung vorhanden?');
    end;
 
 
 
 
 
Mit freundlichem Gruß

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

Antworten