Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Download mit IdFtp.get erzeugt 5byte-Dateien (https://www.delphipraxis.net/134907-download-mit-idftp-get-erzeugt-5byte-dateien.html)

livemedia 1. Jun 2009 01:16


Download mit IdFtp.get erzeugt 5byte-Dateien
 
Hallo

Ich Arbeite derzeit mit Delphi2009 und bringe ein altes Project von mir auf den aktuellsten Stand. Dabei lade ich von diversen FTP-Servern jeweils ein Verzeichnis herunter und lege die Dateien in einer Struktur auf der Festplatte zur weiteren Bearbeitung aus.

Das hat soweit auch immer gut geklappt. Nun hab ich schon mitgekommen das die Erkennung der Dateinamen nicht mehr so ist wie bei Delphi2007 - aber das hab ich hinbekommen. Mein Programm liest nun wieder korrekt die Dateien in dem ftp-Verzeichnis ein und zeigt in der Listbox die Namen und die Dateigröße korrekt an. Nach einer Prüfung ob die Datei schon auf der Platte ist startet der Download. Die erzeugten Dateien sind aber immer nur 5 Byre groß.

Ein normaler Zugriff mit beliebigen FTP-Programmen geht ohne Probleme.

Hier ein Auszug aus dem Script

Delphi-Quellcode:
 procedure TForm1.ButtonClick(Sender: TObject);
 var i         : integer;
      count     : integer;
      name      : string;
      basedir   : string;                  // Verzeichnis auf der Festplatte
      currentdir : string;                  // Ordner auf dem Server
      ftplist   : TIdFtpListItems;
      ftpfile   : TFileStream;

begin
 if IdFTP1.connected = false then
  begin
    IdFTP1.Username          := 'xxxxxx';
    IdFTP1.Password          := 'xxxxxx';
    IdFTP1.Host              := '123.123.123.123';
    IdFTP1.Passive           := TRUE;
    basedir                  := 'z:\projekt\eingang-xxx\';
    currentdir               := 'subdir123';

    IdFTP1.Connect;
    IdFTP1.ChangeDir(currentdir);
    IdFTP1.List;
    ftplist := IdFTP1.DirectoryListing;

    count := ftplist.Count;
    for i := 1 to Count do
      begin
        name := ftplist[i-1].FileName;
        if ftplist[i-1].ItemType = ditFile then
        begin
           Listbox1.items.add(name+' ('+IntToStr(ftplist[i-1].Size)+')');
           if FileExists(basedir+currentdir+'\'+name) = FALSE then
              IdFTP1.Get(name,basedir+currentdir+'\'+name);

           //  ALTERNATIV habe ich das auch schon versucht mit dem gleichen Ergebnis.

           //    ftpfile := TFileStream.Create(basedir+currentdir+'\'+name, fmCreate);
           //    try
           //      IdFTP1.Get(name,ftpfile);
           //    finally
           //      FreeAndNil(ftpfile);
           //    end;


        end;
      end;
 
    IdFTP1.Quit;
    iDFTP1.Disconnect;
  end;
end;

mjustin 1. Jun 2009 09:04

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Zitat:

Zitat von livemedia
Nach einer Prüfung ob die Datei schon auf der Platte ist startet der Download. Die erzeugten Dateien sind aber immer nur 5 Byre groß.

Was steht in den Dateien denn drin, die korrekten ersten Bytes der erwarteten Daten, oder Zufallswerte?
Eventuell hilft auch ein Update auf die neueste Indy Version. Testweise würde ich lokal einen eigenen FTP Server wie z.B. FileZilla starten und prüfen, ob es dort besser funktioniert. Könnte es ein Rechteproblem sein?

Klaus01 1. Jun 2009 09:48

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Zitat:

Zitat von livemedia
Delphi-Quellcode:
if FileExists(basedir+currentdir+'\'+name) = FALSE then
          IdFTP1.Get(name,basedir+currentdir+'\'+name);

Wenn es das normale FileExists sein sollte, welches Du hier verwendest,
das wird wenn Du einen FTP Server abfragst nicht funktionieren.

Grüße
Klaus

livemedia 1. Jun 2009 11:01

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Zitat:

Zitat von mjustin
Was steht in den Dateien denn drin, die korrekten ersten Bytes der erwarteten Daten, oder Zufallswerte?
Eventuell hilft auch ein Update auf die neueste Indy Version. Testweise würde ich lokal einen eigenen FTP Server wie z.B. FileZilla starten und prüfen, ob es dort besser funktioniert. Könnte es ein Rechteproblem sein?


Beim Vergleich der Originaldateien vom Server und denen auf meiner Festplatte sehe ich, das die ersten 5 Byte identisch sind.
Probleme mit Rechten o.ä. kann ich eigentlich ausschliessen. Ein beliebiges FTP-Programm funktioniert einwandfrei für diese Aufgabe.

livemedia 1. Jun 2009 11:04

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Zitat:

Zitat von Klaus01
Zitat:

Zitat von livemedia
Delphi-Quellcode:
if FileExists(basedir+currentdir+'\'+name) = FALSE then
          IdFTP1.Get(name,basedir+currentdir+'\'+name);

Wenn es das normale FileExists sein sollte, welches Du hier verwendest,
das wird wenn Du einen FTP Server abfragst nicht funktionieren.

Danke für die Antwort

Verstehe deine Anmerkung aber leider nicht. Warum sollte das nicht funktionieren ?
Ich prüfe ob eine Datei LOKAL schon vorhanden ist bevor ich sie vom FTP-SERVER lade.

Gerade dieser Teil funktioniert eigentlich perfekt. Wenn ich testweise eine einzelne Datei lokal bei mir lösche in dem Ordner wird auch nur genau diese eine vom Server neu geladen. Da sehe ich nun wirlich kein Problem.

Klaus01 1. Jun 2009 11:10

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Zitat:

Zitat von livemedia
Zitat:

Zitat von Klaus01
Zitat:

Zitat von livemedia
Delphi-Quellcode:
if FileExists(basedir+currentdir+'\'+name) = FALSE then
          IdFTP1.Get(name,basedir+currentdir+'\'+name);

Wenn es das normale FileExists sein sollte, welches Du hier verwendest,
das wird wenn Du einen FTP Server abfragst nicht funktionieren.

Danke für die Antwort

Verstehe deine Anmerkung aber leider nicht. Warum sollte das nicht funktionieren ?
Ich prüfe ob eine Datei LOKAL schon vorhanden ist bevor ich sie vom FTP-SERVER lade.

.. dann habe ich Deinen Code fehlinterpretiert, lokal prüfen ist kein Problem.

Grüße
Klaus

livemedia 4. Jun 2009 00:18

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Hallo

Ich komme da nicht so richtig weiter.

Ingesamt lade ich von 5 Servern Dateien herunter. Das beschriebene Problem mit den 5 Byte-Dateien ist nur bei einem vorhanden. Von den anderen 4 Servern werden die Dateien geladen - allerdings nur von 3 ohne Probleme. Beim anderen Server werden die Dateien zwar geladen aber Zip Archive z.B. sind defekt und in PDF-Dateien sind leere Seiten drin.

Alles Erscheinungen die ich beim Download mit z.B. WSFTP nicht habe und auch unter Delphi2007 nicht aufgetaucht sind - "damals" auch schon mit Indy10.

Frage daher : Gibt es andere "brauchbare" FTP-Komponenten oder noch irgendwelche Optionen die ich vergessen haben könnte ?

livemedia 4. Jun 2009 12:21

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
OK - Lösung gefunden.

Keine Ahnung warum das auf einmal anders ist. Bisher war es doch wohl immer so das

Delphi-Quellcode:
IdFTP1.TransferType := ftBinary;
als Standard gesetzt ist. Bei den Indys im Lieferumfang von Delphi 2009 scheint das aber nicht mehr so zu sein.
Nachdem ich die Zeile hinzugefügt habe funktioniert alles wieder einwandfrei.

Assertor 4. Jun 2009 13:18

Re: Download mit IdFtp.get erzeugt 5byte-Dateien
 
Hi,

Zitat:

Zitat von livemedia
Keine Ahnung warum das auf einmal anders ist. Bisher war es doch wohl immer so das

Delphi-Quellcode:
IdFTP1.TransferType := ftBinary;
als Standard gesetzt ist. Bei den Indys im Lieferumfang von Delphi 2009 scheint das aber nicht mehr so zu sein.
Nachdem ich die Zeile hinzugefügt habe funktioniert alles wieder einwandfrei.

Du hast recht. Der Default Type wurde von ftBinary auf ftASCII geändert am 22.01.2008. Grund: Vollständige Entsprechnung mit dem Standard des FTP Protokolls aus RFC 959.

Und an die müssen (sollten) wir Programmier und nunmal alle halten... Ist aber sowieso besser, selbst den Transfermode festzulegen. Deswegen kann man das ja auch in FileZilla und Co.

Es gibt viele FTP Befehle, die diesen nämlich zurücksetzen.

Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

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