![]() |
nur Teile einer Datei per FTP vom Server laden
Hallo Leute,
zum Herunterladen von Datendateien per FTP verwende ich
Delphi-Quellcode:
Das funktioniert soweit auch.
IdFTP1.Get(quellfilename, zielpath + zielfile, false);
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 |
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. :) |
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. |
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.
|
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:
Dann musst Du einen OnWork-Handler zuweisen, in dem Du den Transfer nach einer bestimmten Anzahl von Bytes abbrichst:
IDFtp1.RecvBufferSize := 128;
Delphi-Quellcode:
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.
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer); begin if AWorkCount > 64 then IdFTP1.Abort; end; |
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 |
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 |
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 :) )
|
Re: nur Teile einer Datei per FTP vom Server laden
Hallo Klaus01,
nein, mit
Delphi-Quellcode:
ist die Fehlermeldung nicht unterdrückbar.
try ... except ... end
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 |
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 |
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:
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.
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; |
Re: nur Teile einer Datei per FTP vom Server laden
Hallo Cyberaxx,
Delphi-Quellcode:
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. try IdFTP1.Abort; except end Wenn ich bei Indy-FTP bleibe, werde ich wohl mit der Meldung leben müssen. mfg eddy |
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.
|
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 |
Re: nur Teile einer Datei per FTP vom Server laden
Ja genau das wollte ich zuerst noch in meinem Post schreiben.
Zitat:
|
Re: nur Teile einer Datei per FTP vom Server laden
Ich kann das ebenfalls bestätigen keinen Error wenn man IdFTP.Abort nutzt.
|
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 |
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