Größe einer Datei aus dem I-Net ???



  • So jetzt ich nochmal ...

    @veganza <- wusste garnicht das man bei Codguru was klauen kann !!Die sachen werden da doch frei zur verfügung gestellt.!! Also wo ist das Prob..
    Und wie oft liest man hier im Forum "Schau bei CodeGuru nach"

    Und wie ist das wenn dieser Beitrag ins Forum wandert. Dann klauen wir auch alle von dort ??? Sehr merkwürdig....

    Anstatt über andere herzuziehen mal drüber nachdenken wozu das forum hier da ist...

    Um zu HELFEN .... und HAPPOSAI hat mir geholfen (Vielen Dank nochmal dafür)
    im gegensatzt zu dir mit diesen Sinlosen Beitrag !!

    So und jetzt ab ins Forum damit @deus

    AndOne 😃



  • @AndOne
    So kann ich das natürlich nicht stehen lassen:

    Um zu HELFEN .... und HAPPOSAI hat mir geholfen (Vielen Dank nochmal dafür)
    im gegensatzt zu dir mit diesen Sinlosen Beitrag !!

    Um zu HELFEN .... und HAPPOSAI hat mir geholfen (Vielen Dank nochmal dafür) im Gegensatz zu Dir mit diesem sinnlosen Beitrag !!

    Und nochmal Danke für Deine sinnlose Erklärung, daß mein Beitrag sinnlos war !!!

    MfG veganza



  • Noch etwas hoffentlich sinnvolles ( traue mich ja schon gar nicht mehr zu posten ) :

    Ich würde um

    //Datei öffnen
    pNetFile = pInetSession.OpenURL(strFileName, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
    

    diesen Code noch ein try -> catch schreiben !!!

    In etwa so :

    try
    {
          pNetFile = pInetSession.OpenURL(strFileName, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
    }
    catch(CInternetException *IE)  //mgl. Fehler abfangen
    {
          CString strError;
          TCHAR   cError[255];
          IE->GetErrorMessage(cError, 255);
          strError = cError;
          pYourDlg->m_Status = strError;  //Fehler anzeigen im Static
          nDownloadOK = 0;
    }
    

    damit nicht existente URL's nicht in einer Exception enden 😉

    MfG veganza



  • Das öffnen ist doch eigentlich schon in einem try-Block, oder meinst du was anderes?

    Zu codeguru.com:
    Ich weiß nicht, wieso, aber die Sources auf codeguru.com sind immer unter aller Sau geschrieben. Leerzeilen gibt's da net, Anweisungen stehen hintereinander, ungarische Notation ist oftmals ein Fremdwort. 😞 Allein das Ordner der Codezeilen ist schon eine Arbeit gewesen.
    Der Code stand kostenlos bereit, ich hab ihn in mein Prog eingebaut und in einigen Dingen verändert. Wer damit ein Porblem hat, darf ja gern weiterhin den Originalcode von Aviad Tobaly nehmen. Soll mir egal sein.
    Und auch auf codeguru.com oder codeproject.com gibt's viel doppeltes!
    Muss ich mich noch weiter rechtfertigen? 😡

    Happosai

    PS: Ich bin mit dem Code vollauf zufrieden, kann meinetwegen gern in die FAQ als Einzelthread verschoben werden.

    [ Dieser Beitrag wurde am 15.11.2002 um 16:38 Uhr von Happosai editiert. ]



  • @Happosai

    Rechtfertigen mußt DU dich nicht...

    Das öffnen ist doch eigentlich schon in einem try-Block, oder meinst du was anderes?

    Setzte mal anstelle von

    CString strFileName = "http://www.volkard.de/vcppkold/vcppk.zip";
    
    CString strFileName = "http://www.dieurlgibtesnicht.de/data/datei.zip";
    

    Führe das dann aus... und Du wirst eine Exception bekommen !!!

    Und auch auf codeguru.com oder codeproject.com gibt's viel doppeltes!

    Das ist deswegen doppelt weil der Autor das auf diesen beiden Seiten veröffentlicht ( ist doch immer die gleiche Person )...



  • veganza:
    Das kann ich nicht bestätigen. Bei mir springt er da ganz brav in den catch-Block und schreibt ins Statusfenster, dass es diese Adresse net gibt.



  • Mit "doppelt" meinte ich, dass er mehrere, verschiedene Lösungen für ein Problem gibt. Von verschiedenen Autoren.
    So viel Möglichkeiten kann's aber nicht geben, eine Datei aus dem Netz zu laden. Irgendwann ist schluss und man muss sich einfach den besten Code raussuchen. Auch wenn alle das selbe machen, der, der besser gegliedert oder kommentiert ist, wird genommen.

    Happosai



  • Jetzt streitet euch doch nicht wegen so ner Kleinigkeit, das ist ja lächerlich.



  • @dEUs

    Welches OS hast Du ???

    Ich benutze zwar ein erweitertes "original" von Codeguru aber unter Win2k bekomme ich damit eine Exception wenn ich nicht zusätzlich try-catch mache... muß das mal verifizieren !!!

    Meine Test-Url war einfach "http://127"... vielleicht liegt das daran ( ist ja gar keine gültige URL ) ???

    Kannst Du die Exception vielleicht mit dieser URL reproduzieren ???

    Ich schau mir das gleich nochmal an...

    MfG veganza

    [ Dieser Beitrag wurde am 15.11.2002 um 19:36 Uhr von veganza editiert. ]



  • Original erstellt von dEUs:
    Jetzt streitet euch doch nicht wegen so ner Kleinigkeit, das ist ja lächerlich.

    Der Meinung bin ich auch. Schluss damit 😉

    Ich hab WinXP Home. Bei mir funzt es mit dem catch-Block.

    Happosai



  • @Happosai

    Original erstellt von dEUs:
    Jetzt streitet euch doch nicht wegen so ner Kleinigkeit, das ist ja lächerlich.

    Original erstellt von veganza:
    P.S. Jetzt ist aber wieder aus mit streiten

    Hatte ich schon 12 Postings vorher geschrieben !!!

    _________ (soll der Schlußstrich sein)

    Original erstellt von Happosai:
    Ich hab WinXP Home. Bei mir funzt es mit dem catch-Block.

    Meinst Du damit ein einfacher try-catch Block wie bei Deinen Sourcen und http://127 als URL springen bei Dir in die catch-Anweisung ???

    MfG veganza

    [ Dieser Beitrag wurde am 17.11.2002 um 21:14 Uhr von veganza editiert. ]



  • Jup, bei mir steht brav da, dass die Adresse nicht verarbeitet werden konnte.

    Happosai



  • Ach ja ich wollte ja noch antworten...

    Es funktioniert jetzt natürlich auch bei mir mit nur 1 try-catch Block !!!

    Habe ein wenig mit Copy-Paste das ganze in eine neue Thread-Funktion kopiert... und mit der neuen Thread-Funktion hat es dann funktioniert.

    Ich bin der Sache noch nicht weiter nachgegangen... gehe aber stark von aus, daß ich mich irgendwo "verschachtelt" hatte und er deshalb nie in den catch-Block gegangen ist !!!

    MfG veganza



  • Freut mich 🙂

    Bin grad dabei, Resuming mit in den Code einzubauen. Mal sehen, wie lange ich dafür brauche, liegen grad wieder viele Klausuren an... 😉

    Happosai



  • @Happosai

    Wenn ich mich jetzt nicht vertippt und keinen Denkfehler drin habe, sollte damit RESUME möglich sein.

    UINT DownloadFile(LPVOID pParam)
    {
       char cReadBuffer[512];  //Lese-Buffer
    
       //YourDlg = der Dialog, in dem die Funktion aufgerufen wurde bzw. in dem
       //die Informationen angezeigt werden sollen
    
       CMFCTestDlg* pYourDlg = (CMFCTestDlg*)pParam;
    
       CInternetSession pInetSession;  //Internet-Sitzung
       CStdioFile*      pNetFile;      //liest später die Datei vom HTTP-Server
    
       CString strFileName = "http://www.volkard.de/vcppkold/vcppk.zip";  //Internet-Dateiname
       CString strLocalFileName = "C:\\vcppk.zip";          //Dateiname auf'm PC
       CString strPercent       = "0 % (0 / 0 Bytes)";       //zeigt später in einem Static (Member-Variable m_Percent;
                                                            //Typ: CString) den Fortschritt an
    
       int nFileSize = 0;  //Dateigröße in Bytes
    
       try  //wir VERSUCHEN die Datei zu öffnen
       {
          //m_Status = Static-Feld, Member-Variable vom Typ CString
          pYourDlg->m_Status = "Vorgang initialisiert. Suche wird gestartet ...";
          pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status);
    
          //Datei öffnen
          pNetFile = pInetSession.OpenURL(strFileName,
                                          1,
                                          INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
    
          pYourDlg->m_Status = "Anfrage gesendet. Warte auf Antwort ...";
          pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status);
    
          //CFile-Instanz zum Schreiben der Datei
          CFile pLocalFile(strLocalFileName,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary); // mit modeNoTruncate, damit bestehndes File erhalten bleibt
    
          nDownloadOK = 1;  //Download erfolgreich (zumindestens bis hier hin...)
    
          //Variablen für's Lesen und für den Fortschritt
          int nBytesToWrite   = 0;
          int nPosProgressBar = 0;
          int nPercent        = 0;
    
          DWORD dwActual = pLocalFile.SeekToEnd(); //Prüfen wie groß das Lokale File bereits ist
    
          //Dateigröße ermitteln
          nFileSize = pNetFile->SeekToEnd(); 
    
          // Prüfen ob ein RESUME vorliegt ???
          if ( dwActual == 0 )
          {
              // Beide File-Pointer wieder zurück an den Anfang
              pLocalFile.SeekToBegin();
              pNetFile->SeekToBegin();
          }
          else
          {
              //Den Inet-File-Pointer an die Endposition des Lokalen-Files stellen
              pNetFile->Seek( dwActual, CFile::begin );
              //Progress-Bar auf den bereits heruntergeladenen Anteil einstellen
              nPosProgressBar = dwActual;
          }
    
          //Datei gefudnen, und genau das sagen wir dem User...
          pYourDlg->m_Status = "Datei gefunden. Download beginnt ...";
          pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status);
    
          //m_Progress = ProgressBar, Member-Variable vom Typ CProgressCtrl
          //Einstellen des Wertebereiches
          pYourDlg->m_Progress.SetRange32(0, 100);
    
          //das eigentliche Lesen und Schreiben der Dateien
          while(nBytesToWrite = pNetFile->Read(cReadBuffer, 512))
          {
             pYourDlg->m_Status = "Datei gefunden. Download läuft ...";
             pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status);
    
             //checken, ob User abbrechen will
             if(nTerminate == 1)
             {
                pLocalFile.Close();
                pNetFile->Close();
                delete pNetFile;
    
                pYourDlg->m_Status = "Vorgang abgebrochen!";
                pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status);
    
                AfxEndThread(0);
             }
    
             //die obige if-Anweisung beliebig oft einfügen, je öfter, desto öfter wird ge-
             //prüft, ob der User abbrechen will
    
             nPosProgressBar += nBytesToWrite;
    
             pLocalFile.Write(cReadBuffer, nBytesToWrite);
    
             //prozentualen Anteil der Operation berechnen
             nPercent  = nPosProgressBar * 100 / nFileSize;
             pYourDlg->m_Progress.SetPos(nPercent);
    
             //Fortschritt in Wort-Form anzeigen
             strPercent.Format("%i %% (%i / %i Bytes)",
                               nPercent, nPosProgressBar, nFileSize);
    
             pYourDlg->m_Percent = strPercent;
             pYourDlg->SetDlgItemText(IDC_STATIC_PERCENT,pYourDlg->m_Percent);
          }  //Lesen beendet !
    
          pLocalFile.Close();
       }
    
       catch(CInternetException *IE)  //mgl. Fehler abfangen
       {
          CString strError;
          TCHAR   cError[255];
    
          IE->GetErrorMessage(cError, 255);
    
          strError = cError;
    
          pYourDlg->m_Status = strError;  //Fehler anzeigen im Static
    
          nDownloadOK = 0;
       }
    
       pYourDlg->m_Percent = "0 % (0 / 0 Bytes)";
       pYourDlg->m_Progress.SetPos(0);
       pYourDlg->SetDlgItemText(IDC_STATIC_PERCENT,pYourDlg->m_Percent);   
    
       if(nDownloadOK == 1)  //Download erfolgreich abgeschlossen!!!!
       {
          pYourDlg->m_Status = "Download abgeschlossen.";
          pYourDlg->m_Percent = strPercent;
          pYourDlg->m_Progress.SetPos(100);
          pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status);      
          pYourDlg->SetDlgItemText(IDC_STATIC_PERCENT,pYourDlg->m_Percent);
       }
    
       nClick = 0;   //Button wieder in Anfangszustand versetzen lassen
    
       //IDC_DOWNLOAD ist der Button, mit dem der Thread gestartet wurde.
       //Er war während des Downloads auf "Abbrechen" gestellt (siehe Code unten)
       pYourDlg->SetDlgItemText(IDC_DOWNLOAD, "Download starten");
    
       if(nDownloadOK == 1)
       {
          //Auswertung des erfolgreichen Downloads
       }
       else
       {
          //Auswertung des fehlgeschlagenen Downloads
       }
    
       return 1;  //Thread beendet
    }
    

    MfG veganza

    P.S. Und wer programmiert jetzt das Multi-Threading damit sich eine vorher definierte Anzahl von Threads den Download des Files teilen 😉

    [ Dieser Beitrag wurde am 18.11.2002 um 15:06 Uhr von veganza editiert. ]



  • Jup, dürfte funzen. Hab aber grad keine Zeit, es auszuprobieren. Ich vertrau deinen C++-Künsten und meinem logischen Verständnis aber soweit, dass rein vom humanen Sinn her alles OK scheint.

    Kurz und gut: Klasse Code, kann ja in den FAQ erweitern werden.

    Happosai


Anmelden zum Antworten