Text-File Download

Alles rund um die Programmierung mit Qt
Antworten
zhsmiler
Beiträge: 7
Registriert: 4. Mai 2007 10:42

Text-File Download

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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"
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
zhsmiler
Beiträge: 7
Registriert: 4. Mai 2007 10:42

Beitrag 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..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
zhsmiler
Beiträge: 7
Registriert: 4. Mai 2007 10:42

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
zhsmiler
Beiträge: 7
Registriert: 4. Mai 2007 10:42

Beitrag 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.
zhsmiler
Beiträge: 7
Registriert: 4. Mai 2007 10:42

Beitrag 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!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten