Programm für automatisierten Download
-
Hallo liebes Forum,
ich habe mir ein Programm geschrieben mit dem man Daten, die periodisch aktualisiert werden, aus dem Internet herunterladen kann.
Zumindest habe ich es versucht.
Das Programm funktioniert auf meinem Desktop-PC hervorragend, jedoch wenn ich es auf meinem Laptop ausführe dann werden immer die gleichen Bilddateien abgespeichert. Ich verstehe das nicht. Die Zieldatei wird in der Regel, alle
15min aktualisiert. Folglich, wenn ich ein Downloadintervall von 20min einstelle, sollte immer die aktuelle Datei herunter geladen werden.
Erst dachte ich, dass es wegen der WLAN-Verbindung des Laptops nicht funktioniert aber dann habe ich ihn über LAN angeschlossen, was nichts geändert hat.
Hier erstmal der komplette Code:// InternetFileDownload03.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. // #include "stdafx.h" //Internet Bibliotheken begin #include<windows.h> #include<Wininet.h> #include<iostream> //nötig für "malloc" #pragma comment(lib, "Wininet.lib") using namespace std; //Internet Bibliotheken end LPCSTR Download = "http://wetter.zdf.de/CMO/frontend/subsystem_we/WeShowPicture/0,6008,193,00.gif"; // L I N K HINTERNET hInet, hUrl; SYSTEMTIME systime; //time-variable SYSTEMTIME systimeold; int year = 0; int month = 0; int day = 0; int h = 0; int m = 0; int s = 0; int sref = 0; int sDiffref = 0; int yearold = 0; int monthold = 0; int dayold = 0; int hold = 0; int mold = 0; int sold = 0; int yearDiff = 0; int monthDiff = 0; int dayDiff = 0; int hDiff = 0; int mDiff = 0; int sDiff = 0; bool flag1 = true; bool flag2 = false; //Schalter für Shutdownaktivierung, wird über Startbutton aktiviert bool flag3 = true; //läd einmalig beim Start dein Inhalt von hEdit in string2 int stunden = 0; int minuten = 0; void calcDiff() { yearDiff = year-yearold; monthDiff = month-monthold; dayDiff = day-dayold; hDiff = h-hold; mDiff = m-mold; sDiff = s-sold; if(sDiff<0){mDiff--; sDiff=sDiff+60;} if(mDiff<0){hDiff--; mDiff=mDiff+60;} if(hDiff<0){hDiff=hDiff+24;} if(dayDiff<0){dayDiff=dayDiff+1;} } int GetSize(HINTERNET hUrl) { int length = 1024; char *size = (char*)malloc(length); HttpQueryInfo(hUrl, 5, size, (LPDWORD)&length, 0); return atoi(size); } bool DownloadToFile(HINTERNET hUrl, char *path) { int Bytes, Buffer; // int eBytes; // int SizeOfFile; // SizeOfFile = GetSize(hUrl); // int iProzent; Bytes = 0; // eBytes = 0; Buffer = 16384; bool Loop = true; void *Data = malloc(Buffer); // char output [300]; DWORD written; // float MB, eMB; HANDLE file; file = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if (file == INVALID_HANDLE_VALUE) { // std::cout<< "Error\n"; system("pause"); return false; } // std::cout << "Download startet\n"; while(Loop) { InternetReadFile(hUrl, Data, (DWORD)Buffer, (LPDWORD)&Bytes); if(Bytes == 0) { Loop = false; } else { // eBytes = eBytes + Bytes; WriteFile(file, Data, Bytes, &written, (LPOVERLAPPED)NULL); // iProzent = (eBytes*100)/SizeOfFile; // eMB = (float)eBytes/1000000; // MB = (float)SizeOfFile/1000000; // sprintf(output, "Empfangen: %2.2f MB von %2.2f MB, %d Prozent fertig\n", eMB, MB, iProzent); // std::cout << output; } } CloseHandle(file); return true; } void main() { // hInet = InternetOpen("WinINet Sample Program", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); // hUrl = InternetOpenUrl(hInet, Download, 0, 0, 0, 0); GetLocalTime( &systime ); GetLocalTime( &systimeold ); yearold = systimeold.wYear; monthold = systimeold.wMonth; dayold = systimeold.wDay; hold = systimeold.wHour; mold = systimeold.wMinute; sold = systimeold.wSecond; char szBuffer[30] = { 0 }; char szBuffer2[30] = { 0 }; wsprintf( szBuffer , "%04d.%02d.%02d - %02d:%02d:%02d",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond); printf(szBuffer); printf("\n"); char *string5; string5 = new char[255]; char *string6; string6 = new char[255]; char *string7; string7 = new char[255]; char *string8; string8 = new char[255]; char *string9; string9 = new char[255]; cout << "stunden = "; cin >> stunden; cout << "minuten = "; cin >> minuten; printf("starte...\n"); while(flag1) { GetLocalTime( &systime ); year = systime.wYear; month = systime.wMonth; day = systime.wDay; h = systime.wHour; m = systime.wMinute; s = systime.wSecond; sDiffref = s-sref; if(sDiffref<0){ sDiffref=sDiffref+60;} if(sDiffref>=1) { calcDiff(); wsprintf( szBuffer , "%02d:%02d:%02d",systime.wHour,systime.wMinute,systime.wSecond); wsprintf( szBuffer2 , "%02d:%02d:%02d",hDiff,mDiff,sDiff); // printf(szBuffer); printf(" "); printf("%02d",sDiffref); printf(" "); // printf("szBuffer2 = "); printf(szBuffer2); printf("\n"); sref = s; if((hDiff==stunden)&&(mDiff==minuten)&&(sDiff==0)) { wsprintf( string5, "%04d%02d%02d-%02d%02d%02d",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond); lstrcpy (string6,"D:\\AAA\\"); // P F A D sprintf(string7, "%s%s", string6, string5); lstrcpy (string8,".gif"); sprintf(string9, "%s%s", string7, string8); hInet = InternetOpen("WinINet_Download_Program", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); hUrl = InternetOpenUrl(hInet, Download, 0, 0, 0, 0); printf("starte Download...speichere unter: "); printf(string9); DownloadToFile(hUrl, string9); printf(" Download komplett\n"); Sleep(1000); GetLocalTime( &systimeold ); yearold = systimeold.wYear; monthold = systimeold.wMonth; dayold = systimeold.wDay; hold = systimeold.wHour; mold = systimeold.wMinute; sold = systimeold.wSecond; InternetCloseHandle(hUrl); InternetCloseHandle(hInet); flag1=true; } } Sleep(100); } delete string5; delete string6; delete string7; delete string8; delete string9; }
Zwischen Zeile 186 und 202 findet der Download statt.
Ich weiss echt nicht wo der Fehler liegt. Ich habe auch kaum Erfahrung bezüglich herstellen von Internetverbindungen via c++ und Datenverarbeitung.Kann es sein, dass man noch irgendwo einen Zwischenspeicher löschen muss?
Vielen Dank im Voraus für eure Hilfe.
rom4o
-
Hallo,
versuche es mit INTERNET_FLAG_RELOAD:
InternetOpenUrl(hInet, Download, 0, 0, INTERNET_FLAG_RELOAD, 0);
MfG,
Probe-Nutzer
-
Hallo,
sorry dass ich erst jetzt antworte.
Ich habe es probiert, aber leider hat sich nix geändert.
Ich bin ratlos.Bin dankbar für weitere Ideen.
Gruß rom4o
-
Ok, und wenn du die Kombination INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE:
InternetOpenUrl(hInet, Download, 0, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
verwendest?
MfG,
Probe-Nutzer
-
Was sagen eigentlich die Fehlermeldungen?
Bzw. prüf mal die Rückgabewerte von hInet und hUrl!
Was liefern sie?
Haben sie den Wert NULL, dann mußt Du GetLastError() auswerten.Grundsätzlich sollte man alle Rückgabewerte checken!
Martin
-
@ Probe Nutzer,
ich habe deine Variante und auch diese hier probierthUrl = InternetOpenUrl(hInet, Download, 0, 0, INTERNET_FLAG_RESYNCHRONIZE | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
es funktioniert immer noch nicht.
Nur die erste Gif ist aktuell, danach wird immer die selbe runtergeladen.
Da muss irgendein temporärer Speicher gelöscht werden, anders kann ichs mir nicht
erklären.Ich habe den PC einen ganzen Tag angelassen und das Downloadintervall auf 1Stunde gesetzt. Immer das gleich, wobei die Bilder sogar alle 15min aktuallisiert werden.@ Martin, das Programm läuft doch, es gibt keine Fehler.
Oder habe ich dich falsch verstanden?
Wie könnte ich denn mit GetLastError() einen Fehler abfragen und wie sollte der aussehen?Viele Grüße und Dank,
und sorry, dass ich so unregelmäßig antworte.rom4o
-
So wie ich das jetzt sehe, ist dein Link:
http://wetter.zdf.de/CMO/frontend/subsystem_we/WeShowPicture/0,6008,193,00.gif
keine verlässliche Quelle für aktuelle Daten. Auch heute bekomme ich nur ein gif, das Bilder vom 16.11.09 enthält.
MfG,
Probe-Nutzer
-
Hallo ja komischerweise zeigen die seit 16ten Nov immer das gleiche Bild.
Habe da neulich gelesen, dass die irgendwie ihre Seite umbauen.
Ist sicher nur eine Frage der Zeit bis wieder aktuelle Bilder reinkommen.
Ich habe den Link ursprünglich direkt von der zdf-homepage, von dieser Seite
http://wetter.zdf.de/ZDFwetter/inhalt/19/0,5998,1040051,00.htmlAlso ich habe eine Zeit lang gif´s über mehrere Tage gesammelt und die zu einer GIF zusammengesetzt. Ich werde diese GIF heute abend mal auf meine Homepage hochladen und den Link posten. Sieht wirklich sehr sehr geil aus, die Zeitrafferdarstellung der Wolkenverteilung über Europa.
Bis später
gruß rom4o
-
Hier endlich wie versprochen ein fertiger Satellitenfilm über 6 Tage.
Wenn die gif komplett geladen ist läuft sie mit 25fps.
http://www.file-upload.net/view-2146992/Animation25fps-521frames.gif.htmlAlso mein Programm läuft aber leider immer noch nicht,
immer noch das gleiche Problem.Viele Grüße...rom4o