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

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

Beitrag von mark332 »

Hi Leute,

da ich finde, dass dieses Forum wirklich Anfängerfreundlich ist, werde ich hier einmal mein nächstes Problem posten ;) , Danke schonmal im Voraus.

Mein Programm soll nach dem klick auf einen Button 3 Dateien aus meinem FPT herunterladen, leider lädt es immer nur die erste runter und wartet dann nurnoch auf den Timeout der restlichen Dateien, ohne etwas hertunterzuladen.

Details:
- Passwort/Benutzer stimmt 100% (Strg+C --> Strg+V)
- Verzeichnis stimmt (sonst würde er ja die erste nicht herunterladen...)
- Dateinamen stimmen (Strg+C --> Strg+V)

Der Betreffende Code:

Code: Alles auswählen

 
procedure TForm1.Button_startInstalClick(Sender: TObject);
begin
 { TODO 2 : Fetigmachen
 }
LockExit:=true;
Button_startInstal.Enabled:=false;
ProgressBar_getINI.visible:=true;
Sleep(1000);
FtpGetFile('mark332.bplaced.net','21','MinecraftMultilauncher/Instal/resource.txt','resource.txt',<*>,<*>);
ProgressBar_getINI.position:= ProgressBar_getINI.position + 1;
 
Sleep(1000);
 
FtpGetFile('mark332.bplaced.net','21','MinecraftMultilauncher/Instal/destination.txt','destination.txt',<*>,<*>);
ProgressBar_getINI.position:= ProgressBar_getINI.position + 1;
 
Sleep(1000);
 
FtpGetFile('mark332.bplaced.net','21','MinecraftMultilauncher/Instal/dirs.txt','dirs.txt',<*>,<*>');
ProgressBar_getINI.position:= ProgressBar_getINI.position + 1;
 
Sleep(1000);
 
if (FileExists('Recource.txt')) and (FileExists('Destination.txt')) and (FileExists('Dirs.txt')) then
 begin
ConfIni:=true;
 end
else
ConfIni:=false;
 
if ConfIni=false then
 ShowMessage('There was an Error while downloading installation relevant files, program will exit!');
 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;
Sleep(500);
Application.Terminate;
end;
Ich hoffe ihr habt eine Idee... (ich würde ja mal sagen, dass der Buffer der FTPGetFile-Funktion iwie voll ist und nicht geleert wird...aber naja... Anfänger halt ;) )


MfG mark332

PS: Warum gibt es den [Spoiler]-Code hier nicht??

PSS: Die Sleeps sind nur ne Idee gewesen, auch ohne die ist nichts anders ;)
Zuletzt geändert von mark332 am Do 20. Jun 2013, 13:07, insgesamt 1-mal geändert.

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 »

Ist mein Problem so schwer zu lösen :shock: , oder hat einfach niemand Zeit/Lust sich damit zu befassen ;D

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 282
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

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

Beitrag von h-elsner »

Was benutzt du denn für dein FTP? lnet, indy oder was?
Mit lnet hatte ich das Problem, dass er das Ende der Datenübertragung nicht erkannt hat. Es gab oder gibt noch einen Fehler, der auch im Entwicklerblog beschrieben war. Ich habe dann aufgegeben und Indy benutzt. Damit ging es dann ganz easy und ohne Probleme.

Eventuell mit Wireshark nachsehen, was wirklich passiert. Das hat mir bei meinen mißlungenen Versuchen mit lnet auch geholfen, dem Fehler auf die Spur zu kommen.

Gruß HE

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 »

Ich nutze FTPSend ( http://synapse.ararat.cz/doc/help/ftpsend.html )

Edit: Danke für deine AW übrigens :)

Edit2: Wireshark.... ja, wenn ich jetzt wüsste wie ich damit genau umgehe...

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

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

Beitrag von Scotty »

Du zeigst uns nicht, wie du dich bei dem FTP Server anmeldest. Wenn ich mich im Browser mit ftp://mark332.bplaced.net/ verbinde, dann werde ich nach einem Login gefragt. Mag sein, dass man da anonymous angeben kann; hab ich nicht probiert. Vielleicht hast du nur für eine einzelne Datei das Recht...
Du könntest aber dein Problem per http lösen, das geht im Browser. Die Anleitung dazu steht unter http://synapse.ararat.cz/doc/help/httpsend.html

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 »

Glaub mir ;) der login ist nicht das problem, andere anwendungen von mir können den ja auch nutzen
------------------------------------------------------------
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 »

Für jede Datei wird eine neue Verbindung geöffnet und genau das könnte zu Problemen führen, auch wenn sie nach dem Laden wieder geschlossen wird. Du solltest besser die Verbindung öffnen, dann alle Dateien runterladen und erst dann die Verbindung wieder schließen.

http://synapse.ararat.cz/doc/help/ftpsend.TFTPSend.html
http://www.lazarusforum.de/viewtopic.php?p=31761

FtpGetFile ist für mich eigentlich nur dafür gedacht, wirklich schnell mal eben eine einzige Datei zu laden.

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 »

Okay Danke :D werd' ich mal ausprobieren


Edit: Okay, ich würde das dann mit login...download...logout machen, allerdings habe ich keine Ahnung, welche Argumente die Login-Function haben will.

( http://synapse.ararat.cz/doc/help/ftpse ... html#Login )

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

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

Beitrag von mschnell »

Ich kann mir nicht vorstellen, dass ein neues Login für jede Datei sinnvoll ist.

Ich verwende dauernd ein Programm, das wir vor ein paar Jahren mal geschrieben haben. Das läd tausend Dateien mit einem hoch. Mit einem Login pro Datei würde der Vorgang viel länger dauern. (Übrigens: erfahrungsgemäß geht der "passiv" Mode schneller.)

Es verwendet allerdings lnet statt Synapse und arbeite -wie gesagt - in die andere Richtung. (Heute würde ich vermutlich auch Synapse nehmen...)

-Michael

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, genau das war ja gemeint :D Login...Download(aller Dateien)...Logout, ich müsste nur wissen, wie man diese Function benutzt, weil auf der Seite kein Nutzungsbeispiel steht
------------------------------------------------------------
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 »

Dann schaue Dir mal den Quelltext der Funktion FtpGetFile an. Da solltest Du alle Schritte finden. So mache ich das jedenfalls immer 8)

Nachtrag:

Code: Alles auswählen

function FtpGetFile(const IP, Port, FileName, LocalFile,
  User, Pass: string): Boolean;
begin
  Result := False;
  with TFTPSend.Create do
  try
    if User <> '' then
    begin
      Username := User;
      Password := Pass;
    end;
    TargetHost := IP;
    TargetPort := Port;
    if not Login then
      Exit;
    DirectFileName := LocalFile;
    DirectFile:=True;
    Result := RetrieveFile(FileName, False);
    Logout;
  finally
    Free;
  end;
end;
Result := RetrieveFile(FileName, False); mußt Du dann entsprechend für jede Datei aufrufen und idealerweise jeweils Result beachten. Funktion am besten umbenennen (aber vorher natürlich in Dein Projekt kopieren) und die Parameter kannst Du dann direkt zuordnen (Username:='Name' ...).

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 für deine AW, allerdings würde ich Login gerne als function selbst aufrufen, also in dem ich schreibe:

Code: Alles auswählen

Login(<wasauchimmer>)
<download>
Logout() // <-- Oder sowas in der Art
 
------------------------------------------------------------
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 »

Du kannst eine Login-Funktion erstellen, wo eine globale Instanz von TFTPSend initialisiert wird. Dann eine Funktion (oder den Direktaufruf) mit RetrieveFile bereitstellen und abschließend eine Funktion für den Logout implementieren, wo Logout aufgerufen wird und die Instanz wieder freigegeben wird. Kurz, einfach die obige Funktion in drei Teile zerlegen :wink:

Nachtrag:

Weil ich gerade nichts zu tun hatte, hier mal ein schnell zusammengebautes ungetestetes Beispiel:

Code: Alles auswählen

Var FtpInstance :TFTPSend = Nil;
 
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;
 
procedure Test;
begin
  if FtpLogin('Ip','Port','User','Pass') then begin
    FtpDownload('a','b');
    FtpDownload('c','d');
    FtpDownload('e','f');
    FtpDownload('g','h');
    FtpLogout;
  end;
end;
Zuletzt geändert von Achtzig am Sa 8. Jun 2013, 17:48, insgesamt 1-mal geändert.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

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

Beitrag von creed steiger »

mal ganz anders gedacht:sind am FTP irgendwelche Quotas oder sonstige Sicherheitsmaßnahmen aktiv?

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 »

...

Edit: Nur eine Firewall, die sich für die eingehende IP abschaltet, sollten ftp- user/passwort richtig sein

Antworten