Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi nur Teile einer Datei per FTP vom Server laden (https://www.delphipraxis.net/75302-nur-teile-einer-datei-per-ftp-vom-server-laden.html)

eddy 17. Aug 2006 11:53


nur Teile einer Datei per FTP vom Server laden
 
Hallo Leute,

zum Herunterladen von Datendateien per FTP verwende ich

Delphi-Quellcode:
IdFTP1.Get(quellfilename, zielpath + zielfile, false);
Das funktioniert soweit auch.

Die bereitgestellten Datendateien (ASCII-Text) sind oftmals sehr groß (> 18 MB) und haben immer den gleichen Dateinamen (ältere erhalten die Endung .000 bis .999).

Um ein doppeltes Lesen von bereits geladenen Dateien zu vermeiden, möchte ich nur die ersten 64 Byte einer jeden Datei laden. Die darin enthaltene Information ist im Gegensatz zu den Dateinamen eineindeutig zuzuordnen.

Kann mir jemand bei der Lösung helfen?

mfg
eddy

chaosben 17. Aug 2006 11:57

Re: nur Teile einer Datei per FTP vom Server laden
 
Hi!

Du könntest den BITS Service von Windows nutzen. Dieser unterstützt das Herunterladen von Teilen einer Datei (siehe FileRange).

Aber das ist nur ein Tip am Rande, denn du suchst sicherlich etwas anderes. :)

RavenIV 17. Aug 2006 12:01

Re: nur Teile einer Datei per FTP vom Server laden
 
also so weit ich weiss, kann man bei FTP nicht sagen "Hol mir nur die ersten 64 Bytes von Datei 'filename' und ignorier den Rest".

eine Idee hätte ich allerdings:
- überprüfe (mit einem zweiten Thread), wieviel von der datei per FTP schon gekommen ist.
- Wenn es 64 KB oder mehr ist, dann kopiere die Datei und breche dann den FTP-Transfer ab.
- anschliessend kannst Du die Datei auf 64 K abschneiden und dann weiterverarbeiten.

Cyberaxx 17. Aug 2006 12:50

Re: nur Teile einer Datei per FTP vom Server laden
 
Soweit ich weiss kann man in der FTP Komponente den Fortschritt abfragen(Progress) dort könnte man auch die Datei überprüfen, somit würde das erstellen einen Threads entfallen.

Union 17. Aug 2006 12:55

Re: nur Teile einer Datei per FTP vom Server laden
 
Du musst zunächst die Puffergröße für Deinen Test verringern, z.B.:
Delphi-Quellcode:
IDFtp1.RecvBufferSize := 128;
Dann musst Du einen OnWork-Handler zuweisen, in dem Du den Transfer nach einer bestimmten Anzahl von Bytes abbrichst:
Delphi-Quellcode:
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
   if AWorkCount > 64 then
      IdFTP1.Abort;
end;
Dann kannst Du den Inhalt prüfen, die Puffergröße wieder erhöhen und den OnWork-Handler deaktivieren bzw. anders steuern und den echten Transfer starten. Du kannst die Daten auch in einen Memory-Stream schreiben, so unterbleiben die Festplattenzugriffe.

eddy 17. Aug 2006 17:46

Re: nur Teile einer Datei per FTP vom Server laden
 
Hallo Leute,

vielen Dank für Eure Antworten.

Die Fassung von Union ist die Lösung, die mich meinem Ziel am nächsten bringt.

Allerdings gibt es noch eine häßliche Fehlermeldung (Transfer abortet), die vom Nutzer bestätigt werden muß und somit in einer Schleife, die mehrere Dateien überprüfen soll, stört.

Vielleicht kann man dagegen auch noch etwas unternehmen.

mfg
eddy

Klaus01 17. Aug 2006 17:51

Re: nur Teile einer Datei per FTP vom Server laden
 
..die Fehlermeldung geht nicht weg oder läßt sich unterdrücken wenn Du
idftp1.abort in ein try except o.ä. einpackst?

Grüße
Klaus

TurboMartin 17. Aug 2006 17:57

Re: nur Teile einer Datei per FTP vom Server laden
 
Soweit ich weiß, gibt es irgendeinen Befehl, womit du eine Datei aufteilst (z.B. Byte 1-4) und dann nur das lädst (kann man super sich selber was bauen um was schneller zu laden :) )

eddy 17. Aug 2006 18:12

Re: nur Teile einer Datei per FTP vom Server laden
 
Hallo Klaus01,

nein, mit
Delphi-Quellcode:
try ... except ... end
ist die Fehlermeldung nicht unterdrückbar.

Vielleicht gibt es ein global einstellbaren Parameter in IdFTP, damit die Fehlermeldung unterdrückt wird, aber ich habe nichts dergleichen gefunden.

Ich habe in IdGlobal auch die Stelle gefunden, die die Fehlermeldung generiert, aber noch keine, um diese zu unterbinden.

mfg
eddy

eddy 17. Aug 2006 18:14

Re: nur Teile einer Datei per FTP vom Server laden
 
Hallo TurboMartin,

wenn Dir nun auch noch einfällt, wie dieser Befehl lautet, käme ich vielleicht auch weiter.

mfg
eddy

Cyberaxx 17. Aug 2006 18:33

Re: nur Teile einer Datei per FTP vom Server laden
 
Wie wäre es mit der Fehlerbehandlung, ich habe auf der Arbeit mal nen Programm geschrbeieben für die Elektronischen Bestellungen, da durfte natürlich im Betrieb keine Fehlermeldung kommen. Musste also alles in einer Fehlerbehandlung abfangen so das es im Betrieb nicht hängenbleibt mit einem Dialog.

Delphi-Quellcode:
Uses
  IdFTP, IDException;

// den Download in einem Try / Except setzen und dort dann sowas

Try
// Deine Download Routine oder sonst was ;)
Except
  on E: EIdException do
    Begin

    End;

  on E: EIdProtocolreplyError do
    Begin

    End;

  on E: EIdSocketError do
    Begin

    End;

  on E: EIdNotConnected do
    Begin

    End;
end;
Bin mir jetzt nicht sicher ob das das ist was Du meinst aber so kannst Du die Fehlerdialoge umgehen, denk aber an den Debugmodus. Kann Dir aber jetzt leider nicht aus dem Kopf sagen welche Du für Deinen Fall brauchst musste sie mir damals auch zusammensuchen.

eddy 17. Aug 2006 19:17

Re: nur Teile einer Datei per FTP vom Server laden
 
Hallo Cyberaxx,

Delphi-Quellcode:
     
  try
    IdFTP1.Abort;
  except

  end
funktioniert offensichtlich nicht mit Indy-FTP, da die Fehlermeldung bereits in "InternalGet" generiert wird und nach außen gar nicht als mit try auswertbarer Fehler erscheint.

Wenn ich bei Indy-FTP bleibe, werde ich wohl mit der Meldung leben müssen.

mfg
eddy

Union 17. Aug 2006 19:32

Re: nur Teile einer Datei per FTP vom Server laden
 
Also, ich hab einen Testtransfer programmiert wie in meinem letzten Postr angegeben und ich erhalte keine Fehlermeldung durch abort.

Klaus01 17. Aug 2006 19:39

Re: nur Teile einer Datei per FTP vom Server laden
 
Wie schaut es denn mit

idftp1.Quit und idftp.KillDataChannel aus?

Werden da auch Exceptions geworfen?

Aber normalerweise müßte es doch soetwas in der Art
von cancel geben. Bei einen normale FTP Transfer
kann der User ja auch die Übertragung unter- bzw. abbrechen.

Bezugnehmend auf den vorherigen Post von Union, bekommst Du die
Exceptions denn auch wenn Dein Programm nicht aus der IDE gestartet wurde?

Grüße
Klaus

Cyberaxx 17. Aug 2006 19:45

Re: nur Teile einer Datei per FTP vom Server laden
 
Ja genau das wollte ich zuerst noch in meinem Post schreiben.

Zitat:

... denk aber an den Debugmodus ...
Vllt. bissl doof vormuliert :D

Cyberaxx 17. Aug 2006 20:16

Re: nur Teile einer Datei per FTP vom Server laden
 
Ich kann das ebenfalls bestätigen keinen Error wenn man IdFTP.Abort nutzt.

eddy 17. Aug 2006 20:32

Re: nur Teile einer Datei per FTP vom Server laden
 
Hallo Klaus01,

ja, da gibt es ebenfalls eine Fehlermeldung: "Not Connected"


@Union, @Cyberaxx

Vielleicht liegt es ja an meiner Indy-Version, daß bei mir eine Meldung kommt.

mfg
eddy

Cyberaxx 17. Aug 2006 20:37

Re: nur Teile einer Datei per FTP vom Server laden
 
Sofern ich weiss, nutze ich noch Indy 9.

Wäre aber ein wenig ungeschickt da ne Fehlermeldung auszugeben, finde ich zumindest, denn das ist ja nen interner Befehl der Indy Komponente. Vllt. gibt es in der IdFTP.pas nen Changelog oder direkt auf der HP. Eventuell da mal schauen.

Union und ich können da ja nun wohl nicht mehr so wirklich mitreden :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz