QFTP bricht Verbindung ab

Alles rund um die Programmierung mit Qt
Antworten
daffi
Beiträge: 23
Registriert: 2. Januar 2011 18:44

QFTP bricht Verbindung ab

Beitrag von daffi »

Hi ihr,

Mit QFTP eine Datei zu downloaden ist ja kein Problem.
Allerdings versuche ich das ganze nun mit einem Ordner und dessen Files.

Sprich:

[Mainordner]
-File1
-File 2
-[SubOrdner1]
-File 1
-File 2
-[Subordner 2]

Interessieren tun mich nur die Files der Subordner.
Diese müssen bei Angabe des Mainordners gezogen werden.

Soweit so gut.
Mein Programm zieht die Files des ersten Ordners und bricht dann gegen Ende hin ab.
Ich weis allerdings nicht wieso.

Wäre gut wenn jemand mal drüber guken könnte und mir ggf. meinen Fehler mitteilen kann.

Ich vermute ihr irgendwo in der for Schleife (rot markiert)
Danke
Daffi
Header

Code: Alles auswählen

#ifndef FTPCONNECT_H
#define FTPCONNECT_H

#include <QtGui>
#include <QtNetwork>
#include <QByteArray>
#include <QtGui/QMainWindow>

#include "deviceroutine.h"

using namespace std;

class FTPconnect : DeviceRoutine
{
		Q_OBJECT
public:
	FTPconnect(Ui::DeviceRoutineClass *,QWidget *parent = 0, Qt::WFlags flags = 0);
	~FTPconnect();

	QProgressDialog *progress;			// ProzessDialog
	QFtp *ftpzeiger;					// Zeiger auf das FTP Objekt
	QFile *file;						// Zeiger auf das AusgabeFile
	bool abgebrochen;

private:
	//Zeiger auf die UI der DeviceRoutine
	Ui::DeviceRoutineClass* ui;
	//Array für alle Verzeichnisse des FTP
	vector <QString> directorylist;
	int dircount;

public slots:
	void ftp_start();
	void ftp_ende();
	void ftp_progress(qint64 done,qint64 total);
	void ftp_CommandFinished(int, bool error);
	void ftp_CommandStarted(int id);
	void ftp_abort();

	void getfiles(const QUrlInfo &);
	void getdirectories(const QUrlInfo &);
	void getdirectories_ende();
};

#endif
cpp

Code: Alles auswählen

#include "FTPconnect.h"
#include "deviceroutine.h"
#include <QMessageBox>

FTPconnect::FTPconnect(Ui::DeviceRoutineClass *ui,QWidget *parent, Qt::WFlags flags) : DeviceRoutine(parent, flags){

	//Zeiger auf UI setzen
	this->ui=ui;
	file=NULL;
}

FTPconnect::~FTPconnect(){}

void FTPconnect::ftp_start(){
		
	//Ausgabe Nullen
	ui->textEdit_ausgabe_FTP->setText("");
	//Flag fürs abbrechen Nullen
	abgebrochen=false;

	progress= new QProgressDialog("Analysiere Verzeichnisstruktur...", "Abbrechen", 0, 100, this);
	progress->setAutoReset(0);
	connect(progress, SIGNAL(canceled()), this, SLOT(ftp_abort()));

		//Ftp bereistellen
		ftpzeiger = new QFtp();
		ftpzeiger->setTransferMode(QFtp::Active);

		//Events für Ende und Datenübertragung
		connect(ftpzeiger, SIGNAL(done(bool)), this, SLOT(getdirectories_ende()));
		connect(ftpzeiger, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(ftp_progress(qint64,qint64)));	
					connect(ftpzeiger, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(ftp_progress(qint64,qint64)));	
			connect(ftpzeiger, SIGNAL(commandFinished(int,bool)),this, SLOT(ftp_CommandFinished(int,bool)));

		//Hole nur Verzeichnisse
		connect(ftpzeiger, SIGNAL(listInfo(QUrlInfo)),this, SLOT(getdirectories(QUrlInfo)));

		//Host aus dem Lineedit holen
		this->ftpzeiger->connectToHost(ui->lineEdit_host->text());
		
		//Logindaten - Wenn beide Felder leer --> anonymous Login
		if ((ui->lineEdit_login->text())=="" && (ui->lineEdit_passwort->text()==""))
			ftpzeiger->login();
		else
			ftpzeiger->login(ui->lineEdit_login->text(),ui->lineEdit_passwort->text());
		
		if (ui->lineEdit_verzeichnis->text()==0){
			ui->textEdit_ausgabe_FTP->append("Bitte ein Verzeichnis angeben...");
			this->~FTPconnect();
			return;
		}
		//Verzeichnis und File auswählen
		ftpzeiger->cd(ui->lineEdit_verzeichnis->text());

		//Directory Listing
		ftpzeiger->list();	
	//Event Schleife
	progress->exec();

	if(directorylist.size()==0)
		ui->textEdit_ausgabe_FTP->append("Keine gueltigen Dateien gefunden...\n");

[color=red]	for(dircount=0;dircount<directorylist.size();dircount++){	
		progress= new QProgressDialog("Kopiere Dateien...", "Abbrechen", 0, 100, this);

			//Events für Ende und Datenübertragung
			connect(ftpzeiger, SIGNAL(done(bool)), this, SLOT(ftp_ende()));
			connect(ftpzeiger, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(ftp_progress(qint64,qint64)));	
			connect(ftpzeiger, SIGNAL(commandFinished(int,bool)),this, SLOT(ftp_CommandFinished(int,bool)));
			connect(ftpzeiger, SIGNAL(commandStarted(int)),this, SLOT(ftp_CommandStarted(int)));

			//Hole nur Dateien
			connect(ftpzeiger, SIGNAL(listInfo(QUrlInfo)),this, SLOT(getfiles(QUrlInfo)));

			//Verzeichnis und File auswählen
			ftpzeiger->cd(directorylist[dircount]);

			//Directory Listing
			ftpzeiger->list();	

			ui->textEdit_ausgabe_FTP->append("Verzeichnis:" + directorylist[dircount]);
		progress->exec();[/color]
	}
}

void FTPconnect::ftp_ende(){
	if (abgebrochen==1){
		ui->textEdit_ausgabe_FTP->append("\nDownload abgebrochen!");
		file->close();
		file->remove();
		file->deleteLater();
		file=NULL;
	}
	 if(ftpzeiger->error()==0)
		ui->textEdit_ausgabe_FTP->append("Datei erfolgreich heruntergeladen!");
	else
		ui->textEdit_ausgabe_FTP->append(this->ftpzeiger->errorString());

	//Aufräumen
	//this->progress->close();
	//this->progress->deleteLater();
	//this->progress=NULL;  

	//this->file->close();
	//this->file->deleteLater();
	//this->file=NULL;	
	
	return;
}

//setze DL Fortschritt in Progressbar um
void FTPconnect::ftp_progress(qint64 done,qint64 total){	
	this->progress->setMaximum(total);
	this->progress->setValue(done);
}

void FTPconnect::ftp_CommandFinished(int, bool error){

	if (ftpzeiger->currentCommand() == QFtp::ConnectToHost) {
		ui->textEdit_ausgabe_FTP->append("Verbindung zum Host aufgebaut...\n");
		if (error){
			ui->textEdit_ausgabe_FTP->append(ftpzeiger->errorString ());
			this->progress->close();
		}
	}

	if (ftpzeiger->currentCommand() == QFtp::Login){
		ui->textEdit_ausgabe_FTP->append("Logindaten ueberprüft...\n");
		 if (error){
			 ui->textEdit_ausgabe_FTP->append(ftpzeiger->errorString ());
			 this->progress->close();	
		 }
	}

	if (ftpzeiger->currentCommand() == QFtp::Get) {
		ui->textEdit_ausgabe_FTP->append("Datenuebertragung beendet...\n");	
		 if (error) {
			 ui->textEdit_ausgabe_FTP->append(ftpzeiger->errorString ());
			 ftpzeiger->abort();
			 this->progress->close();
			 file->close();
			 file->remove();
		 }
	}

	if (ftpzeiger->currentCommand() == QFtp::List) {
		ui->textEdit_ausgabe_FTP->append("Verzeichniss eingelesen...\n");	
		 if (error) {
			 ui->textEdit_ausgabe_FTP->append(ftpzeiger->errorString ());
			 ftpzeiger->abort();
			 this->progress->close();
		 }
	}
}
	
void FTPconnect::ftp_CommandStarted(int id){
			
	if (ftpzeiger->currentCommand() == QFtp::ConnectToHost) 
		ui->textEdit_ausgabe_FTP->append("Verbindung zum Host wird aufgebaut...");
			
	if (ftpzeiger->currentCommand() == QFtp::Login)
		ui->textEdit_ausgabe_FTP->append("Logindaten werden ueberprüft...");
			
	if (ftpzeiger->currentCommand() == QFtp::Get) 
		ui->textEdit_ausgabe_FTP->append("Datenuebertragung gestartet...");	

	if (ftpzeiger->currentCommand() == QFtp::List) 
		ui->textEdit_ausgabe_FTP->append("Lese Verzeichniss ein...");	
}

void FTPconnect::ftp_abort(){
	this->ftpzeiger->abort();
	this->progress->close();
	abgebrochen=1;

}

void FTPconnect::getfiles(const QUrlInfo &urlInfo){

	//Wenn Datei ist...
	if (urlInfo.isDir()==false){
		
		progress->setLabelText("Downloade " + directorylist[dircount] + urlInfo.name() + "...");
		/* Hier später auf DevList und DevParm prüfen */

		//Wenn der Rezeptordner nicht existiert,lege ihn an
		if(is_directory("..\\..\\" + directorylist[dircount].toStdString())==false)
			create_directory("..\\..\\" + directorylist[dircount].toStdString());
		

		//File zum schreiben/lesen öffnen
		file = new QFile( "..\\..\\" + directorylist[dircount] + "\\" + urlInfo.name() );
		file->open(QIODevice::ReadWrite);

		ftpzeiger->get(urlInfo.name(),file,QFtp::Binary); 
	}
}

void FTPconnect::getdirectories(const QUrlInfo &urlInfo){

	if (urlInfo.isDir()==true)
		directorylist.push_back(urlInfo.name());
}

void FTPconnect::getdirectories_ende(){

	if(ftpzeiger->error()==0)
		ui->textEdit_ausgabe_FTP->append("Verzeichniss eingelesen...");
	else
		ui->textEdit_ausgabe_FTP->append(this->ftpzeiger->errorString());

	//Aufräumen
	this->progress->close();
	this->progress=NULL;  

	return;
}
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Evt. liegt der Fehler auch noch an einem anderen Ort, aber ganz sicher nicht schön ist, dass du laufend mehr Signals erhälst:

Code: Alles auswählen

  for(dircount=0;dircount<directorylist.size();dircount++) {   
      ...
      //Events für Ende und Datenübertragung
      connect(ftpzeiger, SIGNAL(done(bool)), this, SLOT(ftp_ende()));
       ...
  } 
Im ersten Durchang wird "ftp_ende()" 1x aufgerufen, im 2. 2x, im 3. 3x... usw...

hth!
daffi
Beiträge: 23
Registriert: 2. Januar 2011 18:44

Beitrag von daffi »

Jup du hast vollkommen recht.Habe ich nicht gemerkt,Danke.

Habe nun die Signale davor geschrieben und die alten Signale gelöscht.
Jetzt sieht die Ausgabe zumindest mal ordentlich aus ;)

Jedenfalls zeigt er mir alle Downloads als Beendet an und zuletzt kommt entweder abgebrochen oder er konnte das Verzeichnis nicht wechseln ...
daffi
Beiträge: 23
Registriert: 2. Januar 2011 18:44

Beitrag von daffi »

Hat denn keiner eine Ahnung warum die Verbindung abbricht und nur 3/4 von jeder Datei da ist?
Antworten