Größe einer Datei aus dem I-Net ???
-
Muss er aber ...
oder woher bekommt der IE die Info über die größe der Datei,
denn dort zeigt er es an .
Zum anfang dachte ich auch erst daran aber ne ne daran liegt das nicht.Gibt es vielleicht noch ne andere möglichkeit die größe zu ermitteln ???
AndOne
-
Ich hab's letztens schon mal gepostet, aber egal:
CInternetSession pInetSession; //Internet-Session ;-) CStdioFile* pNetFile; //Liest die Datei von einem HTTP-Server int nFileSize; //Dateigröße in Bytes try //versuchen, Datei zu öffnen { pNetFile = pInetSession.OpenURL("http://www.hp.de/datei.exe", 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); //Dateigröße ermitteln nFileSize = pNetFile->SeekToEnd(); pNetFile->SeekToBegin(); //CFile-Instanz zum Schreiben der Datei auf'm PC CFile pLocalFile("C:\datei.exe", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); //gibt an, wieviel Bytes in die lokale datei geschrieben werden sollen int nBytesToWrite = 0; //let's read & write! while(nBytesToWrite = pNetFile->Read(cReadBuffer, 512)) { pLocalFile.Write(cReadBuffer, nBytesToWrite); } //fertig //möglichen Fehler abfangen catch(CInternetException *IE) { CString strError; TCHAR cError[255]; IE->GetErrorMessage(cError, 255); strError = cError; MessageBox(strError); }
So, das müsste funzen. Hab's aber kastiert: Normalerweise wird ja noch der Fortschritt berechnet und dem User angezeigt. Da das aber hier nicht interessiert, hab ich's weggelassen
Happosai
PS: Können wir das dann mal in die FAQ verschieben? Oder soll ich vorher noch die Möglichkeit des Fortschrittsanzeige einbauen?
[ Dieser Beitrag wurde am 12.11.2002 um 21:25 Uhr von Happosai editiert. ]
-
Nur mit Fortschrittsanzeige
Devil
-
Pack Fortschritt noch rein und mach aus
CFile pLocalFile("C:\datei.exe",
[cpp]CFile pLocalFile("C:****datei.exe",[/cpp]
dann pack ichs in die FAQ
-
Danke Jungs....genau das was ich gesucht habe !
AndOne
-
Wo wir schon dabei sind, pack ich den Thread auch gleich mit rein ;)(Hoffentlich vergess ich nichts beim Zusammenklauben der Zeilen...)
Vor der Funktion noch global deklarieren:
int nTerminate = 0; //Abbruch durch User? int nDownloadOK = 0; //Download erfolgreich beendet? int nClick = 0;
////////////////////////////////////////////////////// //Wir definieren die Download-Funktion ////////////////////////////////////////////////////// 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 CYourDlg* pYourDlg = (CYourDlg*) pParam; CInternetSession pInetSession; //Internet-Sitzung CStdioFile* pNetFile; //liest später die Datei vom HTTP-Server CString strFileName = "http://www.hp.de/datei.exe"; //Internet-Dateiname CString strLocalFileName = "C:\\datei.exe"; //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->UpdateData(false); //Datei öffnen pNetFile = pInetSession.OpenURL(strFileName, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); pYourDlg->m_Status = "Anfrage gesendet. Warte auf Antwort ..."; pYourDlg->UpdateData(false); nDownloadOK = 1; //Download erfolgreich (zumindestens bis hier hin...) //Dateigröße ermitteln nFileSize = pNetFile->SeekToEnd(); pNetFile->SeekToBegin(); //CFile-Instanz zum Schreiben der Datei CFile pLocalFile(strLocalFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); //Variablen für's Lesen und für den Fortschritt int nBytesToWrite = 0; int nPosProgressBar = 0; int nPercent = 0; //Datei gefudnen, und genau das sagen wir dem User... pYourDlg->m_Status = "Datei gefunden. Download beginnt ..."; pYourDlg->UpdateData(false); //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->UpdateData(false); //checken, ob User abbrechen will if(nTerminate == 1) { pLocalFile.Close(); pNetFile->Close(); delete pNetFile; pYourDlg->m_Status = "Vorgang abgebrochen!"; pYourDlg->UpdateData(false); 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->UpdateData(false); } //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->UpdateData(false); if(nDownloadOK == 1) //Download erfolgreich abgeschlossen!!!! { pYourDlg->m_Status = "Download abgeschlossen. Auswerten der Daten ..."; pYourDlg->m_Percent = strPercent; pYourDlg->m_Progress.SetPos(100); pYourDlg->UpdateData(false); } 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"); pYourDlg->UpdateData(false); if(nDownloadOK == 1) { //Auswertung des erfolgreichen Downloads } else { //Auswertung des fehlgeschlagenen Downloads } return 1; //Thread beendet }
Diese Funktion wurde mit Hilfe eines Buttons gestartet, der IDC_DOWNLOAD heißt. Dieser startet bei Click einen Thread und verändert seine Beschriftung so, dass er "Abbrechen" anzeigt. Der Suer kann also mit dem gleichen Button, mit dem er den Download gestartet hat, ihn auch wieder abbrechen!
Dazu schreiben wir diesen Code:void CYourDlg::OnDownload() //Behandlungs-Routine OnClicked für den Button { if(nClick == 0) { nClick = 1; SetDlgItemText(IDC_DOWNLOAD, "Abbrechen"); nTerminate = 0; nDownloadOK = 0; CWinThread* pThread = AfxBeginThread(DownloadFile, //Funktion this, //Zeiger auf dieses Fenster, also der Parameter //der Funktion THREAD_PRIORITY_NORMAL); } else { nClick = 0; nTerminate = 1; //Zeigt dem Thread, dass er abbrechen soll SetDlgItemText(IDC_DOWNLOAD, "Download starten"); } }
Das war's schon. Gleich mal gucken, ob alles richtig ist...
Happosai
Jup, müsste alles stimmen.
Bitte schön!
Krieg' ich jetzt ein Bienchen? *rofl*So, noch kurz ein paar Fehler korrigiert
[ Dieser Beitrag wurde am 12.11.2002 um 22:12 Uhr von Happosai editiert. ]
[ Dieser Beitrag wurde am 14.11.2002 um 06:18 Uhr von Happosai editiert. ]
[ Dieser Beitrag wurde am 14.11.2002 um 06:20 Uhr von Happosai editiert. ]
[ Dieser Beitrag wurde am 14.11.2002 um 18:52 Uhr von Happosai editiert. ]
-
Wieviele Stunden hast du daran gesessen? Das ist ja faszinierend. Danke für den Beitrag :p
-
Naja, stunden wird er wohl nicht gebraucht haben!
-
pYourDlg->UpdateData(false);
Funktioniert das? iirc dürfte es nicht funktionieren ...
-
Original erstellt von dEUs:
pYourDlg->UpdateData(false);
Funktioniert das? iirc dürfte es nicht funktionieren ...Man beachte die Code-Zeile:
CYourDlg* pYourDlg = (CYourDlg*) pParam;
Happosai
-
Ich weiss. Afaik geht das aber nicht von einem anderen Thread aus. Ach, ich teste es einfach mal schnell aus
-
Original erstellt von dEUs:
pYourDlg->UpdateData(false);
Funktioniert das? iirc dürfte es nicht funktionieren ...Funktionieren tut das schon - bloß da is immer so ein dummer ASSERT...
-
LOOL
ASSERT((CWnd*)p == this); // must be us // Note: if either of the above asserts fire and you are // writing a multithreaded application, it is likely that // you have passed a C++ object from one thread to another // and have used that object in a way that was not intended. // (only simple inline wrapper functions should be used) // // In general, CWnd objects should be passed by HWND from // one thread to another. The receiving thread can wrap // the HWND with a CWnd object by using CWnd::FromHandle. // // It is dangerous to pass C++ objects from one thread to // another, unless the objects are designed to be used in // such a manner.
Deswegen würd ich das nciht so machen, sondern per SetWindowText. Wenn du das editierst, dann kannst du auch gleich noch die Fehler im Code rauseditieren:
Einmal nFileSizeBytes statt nFileSize. Die Funktion heisst DownloadFile, in OnDownload wird der Thread aber mit SearchUpdate gestartet. Und das i des letzten ifs der Threadfunktion hat einen Akkzent statt einem Punkt: í statt i
-
Dann sei mal so gut und poste den Alternativ-Code. Ich bleib bei meinem Code. Irgdnwas war da doch, wesegen
GetDlgItem(IDC_IRGENDWAS)->SetWindowText("hallo");
nicht funzte...
Happosai
-
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); nDownloadOK = 1; //Download erfolgreich (zumindestens bis hier hin...) //Dateigröße ermitteln nFileSize = pNetFile->SeekToEnd(); pNetFile->SeekToBegin(); //CFile-Instanz zum Schreiben der Datei CFile pLocalFile(strLocalFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); //Variablen für's Lesen und für den Fortschritt int nBytesToWrite = 0; int nPosProgressBar = 0; int nPercent = 0; //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 }
[ Dieser Beitrag wurde am 14.11.2002 um 23:28 Uhr von dEUs editiert. ]
-
Hi dEUs, du hast oben bei der Initialisierung von strPercent die ) am Ende vegessen
Happosai
-
*g* Das hast du vergessen, das hat schon in deinem Source gefehlt
Du bist schuld! :p
Sind jetzt alle mit dem Source zufrieden? Falls ja, würde ich nen neuen Beitrag aufmachen, ohne unsere Diskussion, den Code reinkopieren und sagen, dass er von dir kommt, ok?[ Dieser Beitrag wurde am 14.11.2002 um 23:29 Uhr von dEUs editiert. ]
-
Naja - viel zu umfangreich um nur eine Datei zu downloaden...
-
Für mich schaut das aus wie eine Kopie von
http://www.codeguru.com/internet/dllfileprog.htmlAber eigentlich könnte es mir ja egal sein
MfG veganza
-
Da muss ich veganza recht geben!
Hier und da ein paar Zeilen modifiziert, vor ein paar Variable ein 'n' und Status-Texte ins Deutsche geändert... Zufall? Wohl eher nicht...Aber vlt ist ja Happosai == Aviad Tobaly....
Wenn nicht dann:[ Dieser Beitrag wurde am 15.11.2002 um 11:39 Uhr von Nemesyzz editiert. ]