Downloadmanager



  • Hallo mitsüchtige Forenteilnehmer 🙂

    In einem anstehenden Projekt würde ich gerne die Funktionalität nutzen
    einen Download an einer bestimmten Stelle zu stoppen und später wieder aufnehmen zu können.

    Kennt ihr eine entsprechende KLasse die man hierfür verwenden könnte?
    Natürlich aus dem Freeware-Bereich. Auf den einschlägig bekannten Seiten
    wie Codeproject und Codeguru war nichts zu finden.

    Ich scheue etwas den Aufwand mich an diesem Teil selbst zu versuchen!

    Habt ihr sonst einen guten Tip wie ich das ganze angehen könnte, wenn
    ich absolut nicht drumrum komme das selbst zu entwerfen?

    Joogel





  • Da habe ich tatsächlich was übersehen. Dank an dich Jochen Kalmbach 🙂



  • Uff..schweeere Kost. Was ich dachte, dass erst so einfach aussah entpuppt sich
    nun als zeitfressender Albtraum.

    Wenn ich von einer Seite oder einem anderen PC eine Datei downloaden möchte
    und den Download pausieren lassen können will, muss ich soweit ich es jetzt
    verstehe:

    1. InternetOpen,InternetConnect und FtpOpenFile verwenden

    2. die Daten in eine Datei schreiben und bei Abbruch und anschließendem
    weiteren downloaden mit fopen("c:\\dateiname.exe","a") festlegen, dass
    die Datei weitergeschrieben werden soll.

    3. Hierbei ist es wichtig bei InternetReadFile im 2 oder 4ten?? Parameter
    anzugeben, ab wo ich in der Datei weiter auslesen will (muss wohl auch Käse
    sein was ich hier erzähl :p )

    Habe ich das zumindest ansatzweise richtig zusammengefaßt? Bei mir hat sich in den Lernprojekten
    absolut nichts getan..alle gelöscht. Die Beispiele in den obigen Links waren entweder
    nicht ganz vollständig, oder haben schon in den kompilierten Projekten nicht
    funktioniert.

    Ich bin schon etwas gaga von dem ganzen gegoogle, aber wäre nett wenn mir
    mal bitte bitte jemand hierbei helfen könnt.

    Ich würde mich über einen Beispielcode freuen, sofern jemand dazu die Zeit
    und Lust aufbringen kann. Mir ist klar, dass ihr sicher besseres zu tun habt,
    nur ich sehe einfach keine Sonne ohne eure Hilfe!



  • Ok hier ein Ansatz der auch funktioniert. Die gewünschte Datei wird
    runtergeladen. Aber wenn ich den Download abbreche und dann fortsetze
    wird die Datei vom Anfang an, zusätzlich zu dem bereits geschriebenen,
    angehängt.

    daher meine Frage, wie ich beim Anhalten des Download nun sinnvoll
    speichern kann, bis wo die Datei bereits geladen wurde. An dem Punkt
    muss ich dann ja auch wieder anfangen beim Fortsetzen des Download.

    HINTERNET url;
      HINTERNET open;
    
      char URL_LOCATION[512] = {"ftp://www.my.de/datei.exe"};
      char final_file_name[512] = {"c:\\dateixx.exe"};
    
      open = InternetOpen("ExampleDL",
         INTERNET_OPEN_TYPE_PRECONFIG,
          NULL,
          NULL,
          0);
    
      url = InternetOpenUrl(open,
          URL_LOCATION,
          NULL,
          0,
          0,
          0);
    
      FILE *saved;
      unsigned long buffer;
      char name[128];
      saved = fopen(final_file_name, "a");
    
      while(InternetReadFile(url, name, sizeof(name), &buffer) && buffer != 0)
      {
         fwrite(name, sizeof(char), buffer, saved);
      name[buffer] = '\0';
      }
      fclose(saved);
    


  • Wie in den Artikeln beschrieben musst du per FtpCommand den Befehl
    "REST (empfangene Datengröße in bytes)" schicken.



  • Und noch ein Kinken, der urplötzlich auftritt: 😞

    "The Stack around the variable name was corrupted"..

    Wenn ich dich richtig verstehe mache ich jetzt praktisch vor dem

    InternetOpenUrl
    

    erstmal folgendes:

    HINTERNET hFtpCommand = NULL;
    BOOL blRes = FtpCommand(open, TRUE, FTP_TRANSFER_TYPE_BINARY, _T("REST 50000"), NULL, &hFtpCommand);
    

    Wobei die 50000 dann der DWORD-Wert wäre, bis zu dem zuletzt innerhalb
    von ReadInternetFile die Datei geschrieben wurde?!



  • Joogel schrieb:

    Und noch ein Kinken, der urplötzlich auftritt: 😞

    "The Stack around the variable name was corrupted"..

    Nimm mal das

    name[buffer] = '\0';
    

    raus. Wenn buffer >= sizeof(name) ist, dann schreibst du ja hinter das Array, was nicht zulässig ist. Ich frage mich auch, wozu du das überhaupt drin hast. Du liest ja einfach nur plain data, hat also nix mit C-Strings zu tun.



  • Die Datei wird offenbar aus irgendeinem Grund nur mit "wb" aber nicht via
    "a" oder "a+" richtig geschrieben...



  • Wenn du's als binary brauchst, dann versuch's doch mal mit "ab" oder "a+b".



  • Danke 🙂 Du hast recht.

    Aber mit dem Pausieren des Download komme ich einfach nicht weiter.



  • Du kannst einen Download nicht pausieren, sondern nur abbrechen.

    Und das Resume hab ich Dir ganz am Anfang mit drei Links versucht zu zeigen...



  • Sei bitte ruhig. Wenn ich Hilfe von dir will, dann sage ich das schon. Mit so einer arroganten Haltung bekommst du bei mir und sicherlich bei anderen Forum-Usern keine Plus-Punkte.



  • Hi falscher Joogel. Es stimmt dass ich keinen Schritt weiter bin
    und sicher liegt es auch daran, dass ich kein Programmierer bin, sondern
    noch Schüler.

    Da JK immerhin helfen wollte und bei mir lediglich falsche Voraussetzungen
    erwartet, finde ich dein Posting einfach nur frech!

    Wenn du eine persönliche Abneigung gegen JK hast klär es mit deinem Usernamen
    und fertig!!

    Anhand der IP wird er als Mod eh sehen, dass ich nicht der bin der den Dreck
    gepostet hat....



  • Joogel schrieb:

    Es stimmt dass ich keinen Schritt weiter bin

    In dem letzten ;ink war ein Code-Snipsel drin:

    CString NetCmd;
    NetCmd.Format("noop\n\rrest %I64d\n\rretr %s",TotalGotSize,NetPathFile);
    if(!CMyFTP::Cmd(NetConn,NetCmd,hNetResponse)){ //throw &NetGetFaultTolerant;
    }
    OpenFile4Append(LocalPathFile,LocalFile);
    #define BufferSize _1K2_
    char Buffer[BufferSize]; DWORD ChunkGotSize=0;
    while(true){
    FaultTolerantX(NetGetFileFault,"FTP get file");
    if(!InternetReadFile(hNetResponse,Buffer,BufferSize,&ChunkGotSize)){
    // ...
    

    So sollte es eigentlich gehen... hab es aber noch nicht probiert... sorry...

    Joogel schrieb:

    Anhand der IP wird er als Mod eh sehen, dass ich nicht der bin der den Dreck gepostet hat....

    Jau...



  • So kann es gehen. Ich habe mich auf den Beitrag konzentriert und
    gar nicht gesehen, dass du ursprünglich den Beitrag in der Diskussion
    des Links meintest.

    Ich probiere das jetzt mal so aus.

    👍


Anmelden zum Antworten