Größe einer Datei aus dem I-Net ???
-
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.
-
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 streitenHatte 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