QFTP bricht Verbindung ab
Verfasst: 9. Januar 2011 20:12
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
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();
};
#endifcpp
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;
}