Seite 1 von 1

QFtp Datei Speichern in QFile

Verfasst: 26. Februar 2008 11:00
von pfusterschmied
Hallo,
ich möchte Dateien von einem FTP Server laden.
Seltsamer weise funktioniert der nachstehende Code für *.txt Files. Daten werden vom Server geholt und können geöffnet werden.

Wenn ich das gleiche mit einer ausführbaren Datei mache (Linux als auch Win32) wir die Datei zwar runtergeladen, kann jedoch nicht geöffnet werden.

Muss ich ausführbare Dateien irgendwie codiert senden(QFtp::Binary) bzw. in QFile abspeichern oder ???
Bitte um einen kleinen Tipp, steh total auf dem Schlauch.

Code: Alles auswählen

#ifdef Q_OS_WIN32 
		 QString fileName = "programm.exe";
	#else 
		 QString fileName ="text.txt";
	#endif
	file = new QFile(fileName);
	if (!file->open(QIODevice::WriteOnly)) 
	{
		updateText += "<b>Verzeichniszugriff fehlgeschlagen!</b><br /> Bitte stellen Sie sicher, dass Sie Schreibrechte besitzten.<br />";
		updateText += "Error: " + QDir::convertSeparators(file->fileName()) +"!";
		textBrowserProcess->setHtml(updateText);
		return;
	}
	qDebug() << path; 
	ftp.get(path,file);

Verfasst: 26. Februar 2008 11:22
von franzf
Jepp, QFtp::Binary setzen. Ich musste auch noch QIODevice::Unbuffered beim Öffnen der Datei angeben (waren keine executables, aber eben auch binary):

Code: Alles auswählen

file->open( QIODevice::WriteOnly | QIODevice::Unbuffered );
ftp->get( fn, file, QFtp::Binary );
Grüße
Franz

Zusatzinfo

Verfasst: 26. Februar 2008 11:24
von pfusterschmied
Hab unter Linux die heruntergeladene Datei gestartet. Folgende fehlermeldung:

Code: Alles auswählen

$ ./programmname
$ bash: ./programmname: Text file busy
Irgendwie wird die Datei mit QFile falsch abgespeichert.

Verfasst: 26. Februar 2008 11:35
von pfusterschmied
Danke für die rasche Antwort.

Anmerkung: Abreite derzeit unter Ubuntu. Die Probleme treten jedoch auch auf der Windowskiste auf.

Folgende neue Probleme:

Bei der Angabe von QIODevice::Unbuffered erhalte ich die Fehlermeldung, dass ich keine Schreibrechte besitzte.

Bei der Verwendung von QFtp::Binary erhalte ich beim Ausführen der Datei:
cannot execute binary file


Irgenwie bzw. Irgendwo ist da der Wurm drinnen.

Danke

Verfasst: 26. Februar 2008 15:32
von pfusterschmied
Funktioniert jetzt sowohl auf Win32 als auch unter Linux:

Code: Alles auswählen

#ifdef Q_OS_WIN32
			if (!file->open(QIODevice::WriteOnly) | QIODevice::Unbuffered) 
		#else
			if (!file->open(QIODevice::WriteOnly)) 
		#endif
		{
			updateText += "<b>Verzeichniszugriff fehlgeschlagen!</b><br /> Bitte stellen Sie sicher, dass Sie Schreibrechte besitzten.<br />";
			updateText += "Error: " + QDir::convertSeparators(file->fileName()) +"!";
			textBrowserProcess->setHtml(updateText);
		}
		else
		{
			ftp.cd("ftp");
			qDebug() << path;
			qDebug() << ftpUrl;

			ftp.get("EPManager.exe",file,QFtp::Binary);
		}

Verfasst: 26. Februar 2008 16:46
von pfusterschmied
Fehlinformation!
Der oben stehende Code funktioniert nur unter Linux.
Kann mir jemand sagen warum unter Windows die heruntergeladene Datei nicht ausführbar ist?

Fehlermeldung: Keine zulässige Win32 Anwendung

Mir ist aufgefallen, dass die Heruntergeladene Datei um 2kb keiner ist als die Originaldatei.

Folgende Code wurde verwendet:

Code: Alles auswählen


         if (!file->open(QIODevice::WriteOnly)) 
      { 
         updateText += "<b>Verzeichniszugriff fehlgeschlagen!</b><br /> Bitte stellen Sie sicher, dass Sie Schreibrechte besitzten.<br />"; 
         updateText += "Error: " + QDir::convertSeparators(file->fileName()) +"!"; 
         textBrowserProcess->setHtml(updateText); 
      } 
      else 
      { 
         ftp.cd("ftp"); 
         qDebug() << path; 
         qDebug() << ftpUrl; 

         ftp.get("EPManager.exe",file,QFtp::Binary); 
      }
Weiters spinnt die QProcessBar unter Windoof. Sobald der Dateidownload startet zeigt diese absolut nichts mehr an:

Code: Alles auswählen


connect(&ftp, SIGNAL(dataTransferProgress( qint64,  qint64)), this, SLOT(updateDataReadProgress(qint64, qint64)));

void epmupdater::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
	// ProgressBar
	progressBar->setMaximum(totalBytes);
	progressBar->setValue(bytesRead);

}