[ InternetReadFile() ] manche dateien lassen sich saugen, andere nicht...
-
Hey all, ich wollte eine einfache Funktion schreiben, mit welcher man eine Datei per HTTP downloaden kann. Wenn ich eine HTML Datei angebe zum downloaden, geht es. Gebe ich aber eine ACE-Datei an (wie die Adresse im Codebeispiel steht), so kann man die Datei nach dem Downloaden nicht öffnen (fehlerhaftes Ace *****iv... Original hat die Datei 44,7 KB. Nach dem herunterladen hat sie 45 KB. Was ist falsch?
void GetHttpFile() { HINTERNET hInternet; HINTERNET hFile; char szBuf[1024]; bool bGO = true; DWORD ReadSize; FILE *fFile; hInternet = InternetOpen("WININET Sample Program", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); hFile = InternetOpenUrl(hInternet, "http://www.dev-com.net/files/projects/walx/datestation/DS-V113.ace", NULL, 0, INTERNET_FLAG_RELOAD, 0); fFile = fopen("C:\\DS-V113.ace", "wb+"); while(bGO) { bGO = InternetReadFile( hFile, &szBuf, 512, &ReadSize); if(bGO && ReadSize == 0) break; szBuf[ReadSize] = '\0'; fwrite(&szBuf, 1, 512, fFile); } fclose(fFile); InternetCloseHandle(hFile); InternetCloseHandle(hInternet); }
--- ANHANG!!! ---
Ouch, ich habe fwrite(&szBuf, 1, ReadSize, fFile); geschrieben, jetzt funktioniert es! Danke!
Wisst ihr, wie ich vor dem eigentlichen Download schon die Dateigröße herausfinden kann? (Möchte eine Statusanzeige des Downloads programmieren...).[ Dieser Beitrag wurde am 25.01.2003 um 18:53 Uhr von ChrisK editiert. ]
-
-
@ChrisK: In welcher Header stehen die Funktionen InternetReadFile(), InternetOpen() usw. ?
-
-> wininet.h
-> wininet.libSchau doch einfach in die MSDN!
cya
-
wininet.h
-
wisst ihr, wie ich die größe der herunterzuladenen datei vor dem downloaden rausbekommen kann ?
-
Probier's mal mit FtpGetFileSize: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetreadfile.asp
Kenn mich aber in dem Gebiet überhaupt nicht aus, sorry.
cya
-
MagiC Creator du wirst mir immer korupter!! FtpGetFileSize bei HTTP?
-
Ich hab doch gesagt, ich kenn mich da nicht aus... aber könnte ja funktioniert... und InternetGetFileSize gibt es laut MSDN nicht...
cya
-
HttpQueryInfo mit HTTP_QUERY_CONTENT_LENGTH als Flag
-
Einwandfrei! THX
-
Jetzt ist nur noch das Problem, dass während des Lesens des Files die ganze Anwendung eingefroren wird. Kann man das irgendwie ändern?
-
Threads?
-
Hmm, ok. Klar. Ich wollte nur, da gäbe es eine Callback-Funktion, in der man mitbekommt wieviele Bytes bisher runtergeladen sind. Wegen der Progress-Anzeige, wisst ihr.
-
Wenn man InternetReadFile benutzt ist das doch garkein Problem?
Man kann doch nach jedem Aufruf dieser Funktion die Progress-Bar aktuallisieren.
-
Verstehe ich nicht. In den anderen Aufrufen müsste ich ja angeben können, von wo das File gelesen werden soll. Ich will ja nicht wieder am Anfang beginnen.
-
nein! dafür gibts doch den file pointer. der liest da wo der zeiger drauf gesetzt ist.
-
Verstehe ich nicht so ganz. Sorry. Bin heute auch etwas langsam.
Ich will jetzt z.B. das File ab Position 100 lesen. Wie schreib ich das in InternetReadFile() rein?
-
InternetSetFilePointer(Parameter hab ich jetzt keine Lust rauszusuchen, nur irgendwo 100 angeben :D);
InternetReadFile(immer noch keine Lust);
-
Achso. Woher soll ich denn wissen, dass es dafür eine extra Funktion gibt. Naja, ich wed's mir mal in der MSDN anschauen.
Ist das Ganze nicht vielleicht ein wenig umständlich, wenn man immer wieder die Funktion InternetReadFile() aufruft? Verlängert das nicht die Downloadzeit?