FastNet FTP Download Pausieren
-
Leider wird das Resume vom Server unterstützt.
Beim Download Restore ist es einfacher, da habe ich dir Datei lokal auf der Platte und dort wird vermutlich dir Größe ausgelesen.Damit die beim UploadRestore auch funktioniert, hole ich mir wie gesagt die Größe des Remotefiles. Über die verschiedenen List Befehle.
Nachdem ich die Größe hab addiere ich 1 dazuNMFTP1->UploadRestore(LokalFile, RemoteFile,pos +1)
Doch wie oben gesagt ist die Position ein Integerwert. Deshalb vermute ich, dass wenn die datei größer ist als der Integerwert repräsentieren kann.
Im Beispiel beim BCB wird die Postion als Byte angebeben.
Somit wäre die Größe 30.000 (+ paar zerqzetschte) Byte. Ist nicht gerade viel.
Meine Files sind um die 10 bis 100 MB.
Ausserdem macht es fast keinen Sinn so kleine Dateien zu resumen.Deswegen frage ich ob es da andere Möglichkeiten gibt, sei es mit einer anderen Komponente oder durch ändern des Aufrufes.
Hat das noch niemand gemacht ?
Gruss FGGF
-
Du musst ja 'ne super Anbindung haben, wenn sich bei 100MB ein Resume fast nicht lohnt ...
Aber was ist denn eigentlich das konkrete Problem? Eine Fehlermeldung o.ä. hast du ja bis jetzt noch nicht genannt.
PS. 100 MB haben locker Platz in int!
-
MMhhh. Stimmt hast ja recht. Ich war in Gedanken bei ner Integergröße von 32.000 maximal.
Aber der hat ja hier ein paar mehr bit-chen *g*Also ich werd jetzt mal ein bisschen Code posten. Denn es funktioniert noch nicht so toll, muss ich sagen. Vielleicht hab ich ja irgendwo nen Fehler drin.
Die Einstellungen Host, User usw. lass ich jetzt mal aus. An denen liegt es nicht ich kann mich ja anmelden.
void __fastcall TForm1::BBUploadClick(TObject *Sender) { NMFTP1->Connect(); NMFTP1->List(); }
Wenn ich +1 bei pos anhänge bringt er ne Fehlermeldung, dass die Fortsetzung nach der insgesamten Dateigröße beginnen würde. Lasse ich die 1 weg, dann fängt er von vorne an.
Oder hab ich im Code nen Denkfehler drin ??
Gruss FGGF
Bei OnSuccess steht drin
void __fastcall TForm1::NMFTP1Success(TCmdType Trans_Type) { int i; switch(Trans_Type) { case cmdList: { for (i = 0; i < (NMFTP1->FTPDirectoryList->name->Count); i++) { StringGrid1->Cells[0][i+1] = NMFTP1->FTPDirectoryList->name->Strings[i]; StringGrid1->Cells[1][i+1] = NMFTP1->FTPDirectoryList->Size->Strings[i]; StringGrid1->Cells[2][i+1] = NMFTP1->FTPDirectoryList->ModifDate->Strings[i]; } } }
Somit hole ich mir die Größe der Dateien auf dem Server. Diese stimmen korrekt überein. Habe das mit lokalem FTP geprüft.
void TForm1::Verify(void) { int i=0,pos=0; bool resume=false; // AnsiString pos2="", UploadFile=""; // if(OpenDialog1->Execute()) UploadFile=OpenDialog1->FileName; for(i=0; i<this->StringGrid1->RowCount; i++) { if(ExtractFileName(UploadFile)==this->StringGrid1->Cells[0][i]) { pos2=(this->StringGrid1->Cells[1][i]); pos=(StrToInt(pos2)+1); // +1 kommt aus dem Beispiel beim BCB NMFTP1->UploadRestore(UploadFile,ExtractFileName(UploadFile),pos); resume=true; } } if(resume==false) { NMFTP1->Upload(UploadFile,ExtractFileName(UploadFile)); } }
-
Hab's grad mal selbst getestet.
Bei mir wird immer die komplette Datei neu übertragen, egal, welche Position ich angebe. Die Position bestimmt einzig, wo die neue Übertragung an die alte angehängt wird. Das fabriziert natürlich jedesmal korrupte Dateien.Schiet Fastnet, ich hoffe, du weisst jetzt, warum hier ständig davon abgeraten wird.
-
Okay FastNet ist scheisse. Dann andere Frage, wie kriege ich eine Resume Funktion beim FTP-Upload hin ? Indy ?? Oer was ganz anderes ?
Gruss Goddie
-
Jaja, ich weiss ich nerve. Aber ich habs mit FastNet hinbekommen. Die Resume-Funktion. Das ist auch nicht meine Frage. *g*
Ich hab nur ein letztes kleines Problem. Nach dem Abbruch der Übertragung mit NMFTP1->Abort();
ist meine Verbindung immer noch offen. Disconnect und andere Methoden scheinen nicht zu gehn. Jede Abfrage NMFTP1->Connected wird mit true beantwortet.
Die ausgworfene Exception habe ich mit try() catch(...) abgefangen.
Weiss jemand wie ich die Verbindung hinterher trennen kann, oder den Status so setzen, dass NMFTP1->Connected false ausgibt ?Gruss Goddie
-
Na irgendwie gehts mit
try { NMFTP1->Abort(); } catch(...) { ShowMessage("Fehler"); }
wohl doch nicht.
Weiss jemand Rat ?
Gruss Goddie
-
Lies dir noch mal den ersten Satz in deinem ersten Beitrag auf dieser Seite durch ...
Im übrigen gehört es zum guten Ton, auch selbstgefundene und/oder triviale Lösungen bekanntzugeben. Also was war nun mit dem Resume?
-
Sorry.
Also zur Resume Funktion. Ist zwar mit Sicherheit nicht die beste Lösung, aber sie funktioniert. Mit InDy wäre es wohl einfacher gegangen aber es geht mit FastNet auch.
Die Resume Funktion hinzubiegen geht mit Hilfe von Streams. Man liest die Größe der Datei auf dem FTP-Server aus.
Dann öffnet man die zu resumende Datei in einem Stream. Dort setzt man die Position auf die Größe der zuvor ausgelesenen Datei auf dem Ftp.
Das Problem an FastNet ist, das er keine Streams senden kann. Zumindest habe ich nicht rausgefunden wie es geht.
Das einzig unschöne ist jetzt, man muss den Stream wieder als Datei speichern. Dann diese neue Datei mit NMFTP1->UploadAppend(LocalFile, RemoteFile) anhängen.
Voila. So funktioinerts.
Ich weiss, dass jetzt einige sagen werden uje wie dumm und kompliziert, geht mit InDy oder so viel viel einfacher. Ja mag ja sein. Aber ich habs hingekriegt, wenn auch über Umwegen und darauf bin ich stolz *fg*
Wenn jemand noch Code will, muss er halt Bescheid sagen. Allerdings muss ich dazu sagen, dass mein Code nicht immer perfekt ist und bei weitem nicht so gut wie bei anderen hier. Aber natürlich würde ich ihn zur Verfügung stellen, wenn jemand Interesse hat.
Wichtig beim Upload ist doch das setzen des binären Übertragunsmodus.
Ansonsten funzt es genau auf diese Weise.Gruss Goddie
PS: Jetzt hab ich nur noch das Problemchen mit Abort und das hinterher meine NMFTP1 Komponente noch connected ist.
-
Ja, NMFTP1->Abort ist die Wahl des Mittels. Allerdings wird hier eine schöne Exception ausgeworfen und der FTP ist immer noch connected und lässt sich auch nicht dazu bewegen zu disconnecten. Könnte mir bitt jemand helfen. Ich bin fast am verzeifeln. Wie kriege ich einen FTP dazu die laufende Datenübertragung abzubrechen und danach die Verbindung zu trennen ?
Gruss Godfather