FastNet FTP Download Pausieren



  • Woher willst du wissen, dass du das gleiche Problem hast, wenn Godfather nicht mal mitteilt, wo/wie er z.B. Abort() aufruft?



  • Also ich kann downloaden und nen abgebrochenen Download resumen. allerdings ist dieser download auf die harte tour abgebrochen. Mit Endthread().
    Ich weiss ich weiss nicht die schöne art. Aber mit den Ereignissen die einen OnTransactionStop auslösen kann ich den Download zwar stoppen und nachher zwar wieder connecten aber nicht mehr downloaden oder resumen. Dies geht nur wenn das proggramm neu gestartet wird. Deshalb hätte ich gerne eine Möglichkeit den Download einfach zu pausieren und danach wieder fortzusetzen. ES muss eine Möglichkeit geben. Schliesslich gehts bei anderen auch.
    Danke an jansen. Du hattest vom Prinzip her ja mal wieder mal recht. Ist keine Indy Componente sondern vom BCB. Also hätten wir das ja mal geklärt. 🙄
    Aber jetzt brauche ich immer noch ne Möglichkeit den Download zu pausieren.
    Und ja jansen ich hab die FAQ durch.

    FGGF 🤡



  • jansen schrieb:

    Woher willst du wissen, dass du das gleiche Problem hast, wenn Godfather nicht mal mitteilt, wo/wie er z.B. Abort() aufruft?

    Kannst du lesen?

    TheGodfather schrieb:

    Wie kann man einen laufenden FTP Download pausieren und danach wieder resumen ?? .......

    mein "auch" problem ist das ich nicht weiß wie ich große dateien pausieren kann
    und dann resumen mit indyFTP.
    also das gleiche wie der fragende.

    Jansen, ich weiß nicht was los ist mit dir, aber wie ich beobachten
    konnte hast du in letzter zeit öffter solche postings abgelassen,
    wenn du helfen kannst dann helfe, sonst lasses, obwohl du sonst gut
    helfen kannst. solche komentare wie:

    jansen schrieb:

    Offensichtlich weisst du gar nicht, was Indy überhaupt ist, sonst würdest du nicht weiter mit FastNet rumkrepeln

    anstelle von:
    "das ist fastnet und nicht indy, schaue dir indy mal an hier(link) an und
    so weiter..."

    kann man sich sparen. mensch jansen du bist nen schlauer bursche hier gieb
    der musik nen anderen ton, den der ton macht die musik.

    Asta la H.K.



  • Webgucker schrieb:

    der ton macht die musik.

    Jo, und ich steh auf Punk und Death Metal! 😃 😉

    Abort() ist das Mittel der Wahl, scheinbar hat Godfather ein Problem damit, macht aber keine weiteren Angaben dazu. Woher soll ich oder willst du wissen, was sein Problem ist? Warum soll ich raten, ob er das zum Beispiel im OnWork-Ereignis aufruft, wenn ich noch nichtmal weiss, ob er jetzt IdFTP oder NMFTP benutzt?

    Der Punkt ist: nur sorgfältig formulierte Fragen haben eine nennenswerte Chance auf hilfreiche Antworten. Eine flüchtig hintippte Frage deutet nicht nur darauf hin, dass sich der Fragesteller nicht besonders mit dem Problem beschäftigt hat, sondern zeigt auch eine Geringschätzung gegenüber potentiellen Helfern.



  • Immer noch das gleiche Problem beim Benutzen der NMFTP-Komponente von FastNet.
    Den Upload breche ich wie Jansen gesagt hat mit Abort() ab.

    Soweit sogut. Allerdings habe ich jetzt ein Problem.
    Die Methode UploadRestore der Komponente besitzt folgenden Aufruf

    UploadRestore(LocalFile, RemoteFile: string; Position: Integer);

    Die Dateigröße der Datei die auf dem Server liegt und fortgesetzt wird hole ich mir über die List (FtpDirectoryList... )Befehle beim NMFTP.
    Das Problem ist der Aufruf selber, die Größe der Datei auf dem Server ist größer als der Integerwert im Aufruf. Wie kann ich bei großen Dateien trotzdem einen abgebrochenen Upload fortsetzen ?

    Gruss Goddie



  • Meines Erachtens muss das Resume vom Server ausdrücklich unterstützt werden, was (insbesondere für den Upload) wohl nicht bei allen der Fall ist. Du solltest also erstmal mit anderen FTP-Programmen und/oder Servern testen, ob eine Wiederaufnahme des Uploads prinzipiell möglich ist.

    Ansonsten verstehe ich deine Fragestellung nicht recht. Den Positionswert legst du doch selbst fest, und der sollte um 1 grösser sein als der bereits heraufgeladene Teil (wenn ich die RFC richtig deute).



  • 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 dazu

    NMFTP1->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


Anmelden zum Antworten