AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Download mit IdFtp.get erzeugt 5byte-Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

Download mit IdFtp.get erzeugt 5byte-Dateien

Ein Thema von livemedia · begonnen am 1. Jun 2009 · letzter Beitrag vom 4. Jun 2009
Antwort Antwort
livemedia

Registriert seit: 14. Mär 2006
8 Beiträge
 
Delphi 2009 Professional
 
#1

Download mit IdFtp.get erzeugt 5byte-Dateien

  Alt 1. Jun 2009, 01:16
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;
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#2

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

  Alt 1. Jun 2009, 09:04
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?
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 1. Jun 2009, 09:48
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
Klaus
  Mit Zitat antworten Zitat
livemedia

Registriert seit: 14. Mär 2006
8 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 1. Jun 2009, 11:01
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.
  Mit Zitat antworten Zitat
livemedia

Registriert seit: 14. Mär 2006
8 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 1. Jun 2009, 11:04
Zitat von Klaus01:
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 1. Jun 2009, 11:10
Zitat von livemedia:
Zitat von Klaus01:
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
Klaus
  Mit Zitat antworten Zitat
livemedia

Registriert seit: 14. Mär 2006
8 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 4. Jun 2009, 00:18
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 ?
  Mit Zitat antworten Zitat
livemedia

Registriert seit: 14. Mär 2006
8 Beiträge
 
Delphi 2009 Professional
 
#8

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

  Alt 4. Jun 2009, 12:21
OK - Lösung gefunden.

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

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.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#9

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

  Alt 4. Jun 2009, 13:18
Hi,

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

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
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 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