Seite 1 von 1

Text-File Download

Verfasst: 20. September 2007 14:10
von zhsmiler
Hallo !
Ich möchte in meinem Programm eine kleine .txt - Datei herunterladen, um die Versionsnummer zu vergleichen..

Code: Alles auswählen

void MediaTuner::checkUpdate(int type)
{
	QUrl url;
	url.setUrl("http://people.ee.ethz.ch/~markussc/mediaportal/mediatuner/version.txt");
	QFileInfo fileInfo(url.path());
	QString fileName = fileInfo.fileName();

	QFile* file = new QFile(fileName);
	
	anfrage1->setHost(url.host());
	
	httpGetId = anfrage1->get(url.toString(), file);
	typeOfRequest = type;
	file->close(); 
	return;
}
Interessant ist, dass dieser Code wunderbar funktioniert, wenn ich das Programm auf Windows erstelle. Auf Mac OSX 10.4 wird eine leere Datei mit dem korrekten Dateinamen erstellt, aber diese bleibt leider leer.
Könnte mir jemand weiterhelfen ?

Gruss und Danke

/edited by Christian81 -> [

Code: Alles auswählen

] - Tags eingefügt damit man auch was erkennt.

Verfasst: 20. September 2007 14:29
von Christian81
Du schliesst die Datei bevor das Signal QHttp::done() angekommen ist. Siehe auch hier, vor allem das "The class works asynchronously, so there are no blocking functions"

Verfasst: 21. September 2007 08:10
von zhsmiler
Danke für den Tipp!

Hab nun die file->close() Zeile auskommentiert, doch es wird (unter OSX) nach wie vor eine leere Datei erstellt..

Verfasst: 21. September 2007 08:14
von Christian81
Du hast es Dir also nicht durchgelesen... :(

Du musst das mit Signals und Slots lösen damit zwischendurch die Qt-Mainloop auch was machen kann (z.B. die Daten abholen). Siehe z.B. examples/network/ftp oder http

Verfasst: 21. September 2007 08:22
von zhsmiler
Entschuldigung, aber natürlich habe ich das Dokument durchgelesen!
Immerhin habe ich unter Windows eine funktionierende Version erstellen können!
Von mir aus gesehen läuft das so:

In der checkUpdate() Funktion wird der Aufruf gestartet (asynchron), die Datei herunterzuladen. Es existiert nun ein SLOT, für den Fall, dass das requestFinished(int, bool) auftritt (--> machIrgendwas(int, bool)).
In machIrgendwas(int, bool) wird die Datei geöffnet und weiterverarbeitet, sowie eine QMessageBox geöffnet mit einer Mitteilung über das Ergebnis dieser Verarbeitung.
Das funktioniert auch soweit, dass diese QMessageBox erscheint, allerdings ist zu diesem Zeitpunkt die geschriebene Datei leer (ich weiss, dass sie leer überschrieben wurde, da ich sie vorher manuell gefüllt habe..).

Hab ich konzeptionell einen Fehler da drin? Ich habe es eigentlich streng nach dem Beispiel http://doc.trolltech.com/4.3/network-ht ... w-cpp.html gemacht !

Danke für konstruktive Hilfe / Kritik

Verfasst: 21. September 2007 08:27
von Christian81
Ok, da sist aus deinem Code-Beispiel aber überhaupt nicht ersichtlich. Poste bitte mal den aktuellen Code.
Funktion in der du den request machst, auch das connect und den Slot. ggf. Auch den header -> Q_OBJECT vergessen? Wird zur Laufzeit eine Fehlermeldung auf der Console (CONFIG += console in der pro-Datei) ausgegeben?

Verfasst: 21. September 2007 08:33
von zhsmiler
Hab noch grad selber eine Idee, wo das Problem liegen könnte.
Melde mich wieder, entweder mit der Lösung, oder detaillierterem Code.

Verfasst: 21. September 2007 08:52
von zhsmiler
Problem gelöst:

in der checkUpdate() wurde ja (ursprünglich) die Datei geschlossen. Unter Windows war offenbar der Download Vorgang sehr schnell, d.h. bereits vor diesem close beendet, d.h. die Datei korrekt geschrieben.

In der machIrgendwas(), die vom requestFinished() aufgerufen wird, wird die erstellte Datei geöffnet und verarbeitet.

Unter OSX hat dieser Ansatz nicht funktioniert, da der Download Vorgang offenbar etwas länger dauert, und die Datei noch nicht geschrieben war, wenn das file wieder geschlossen wurde. Also habe ich file->close() entfernt. Nun ergab sich aber die Situation, dass in der machIrgendwas() die Datei (leer) geöffnet wurde, bevor sie geschlossen war, d.h. es wurde quasi eine neue leere Datei gleichen Namens angelegt, verarbeitet und gespeichert.
Kein Wunder, dass da nie was drinstand.

Die Lösung besteht nun darin (was der schlaue Programmierer natürlich schon von Begin weg so gemacht hätte), einen Klassenglobalen (private) QFile* anzulegen, in der checkUpdate() eine neue Datei anzulegen und den Schreibvorgang zu starten. In der machIrgendwas() wird nun direkt der Inhalt dieser Datei (via QFile - Pointer) ausgelesen.

Danke für die Hilfe!

Verfasst: 21. September 2007 08:57
von Christian81
Oder es gar nicht in en QFile zu schreiben sondern ein QBuffer zu benutzen (natürlich auch als Member in der Klasse). Sollte schneller sein bzw. man muss sich nicht irgend einen Dateinamen ausdenken :)