Seite 1 von 1

QFTP mit USER:PW

Verfasst: 11. September 2007 08:59
von pfusterschmied
Gute Morgen,

Ich möchte Dateien/Ordner von einem FTP Server herunterladen.
Zu Testzwecken verwende ich den lokalen FTP Server unter Linux. Wenn ich den FTP Server öffentlich mache klappt der Download. Wenn ich jedoch einen User und PW vergebe schließt sich das Programm ohne erkenntliche Fehlermeldung.

Ich habe auch schon versucht bewusst ein falsches PW einzugeben ... hier kommt es zu einem QFtp.error(): Login incorrect!

Ich verwende folgenden Code:

Code: Alles auswählen


ftp.connectToHost(url.host(), url.port(21));
	QString user = "xxxxx";
	QString pw = "xxxxx";
	ftp.login(user, pw);
// 	ftp.rawCommand( "PWD" );
// 	ftp.list();
Kann mir jemand weiterhelfen

Verfasst: 11. September 2007 09:05
von upsala
Und was sagt der Debugger?

Verfasst: 11. September 2007 09:08
von pfusterschmied
Das Programm wird vollständig compiliert ohne Fehler,
anschließend startet das Programm ....
wenn die Verbindung zum FTP Server aufgebaut werden soll bricht das Programm ab mit der Meldung:
*** Exited normally ***

Verfasst: 11. September 2007 09:19
von pfusterschmied
Ich habe mir nun mal die logs vom ftp Server angesehen und festgestellt, dass das Login erfolgreich war. Aus irgendeinen Grund bricht QT die Verbindung ab.

Hat jemand eine Lösung?

Verfasst: 11. September 2007 09:29
von Deever
pfusterschmied hat geschrieben:Aus irgendeinen Grund bricht QT die Verbindung ab.
Vermutlich, weil das Programm fertig ist? "Exited normally" läßt jedenfalls darauf schließen?

HTH && Gruß,
/dev

Verfasst: 11. September 2007 10:02
von pfusterschmied
Hatte ich zuerst auch gedacht!
Aber ich möchte von FTP Server eine Ordnerstruktur in ein Lokales Verzeichnis kopiere. Das Verzeichnis (downloads) wird zwar erfolgreich erstellt (auch die unterstruktur der Ordner), jedoch werden keine Dateien kopiert.

Hier mein Code [ist aus Summerfield C++ GUI Programming with QT 4 entnommen]:

Code: Alles auswählen

#include <QtCore>
#include <QtNetwork>
#include <iostream>

#include "spider.h"

using namespace std;

Spider::Spider(QObject *parent)
    : QObject(parent)
{
    connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
    connect(&ftp, SIGNAL(listInfo(const QUrlInfo &)),
            this, SLOT(ftpListInfo(const QUrlInfo &)));
}

bool Spider::getDirectory(const QUrl &url)
{
    if (!url.isValid()) {
        cerr << "Error: Invalid URL" << endl;
        return false;
    }

//     if (url.scheme() != "ftp") {
//         cerr << "Error: URL must start with 'ftp:'" << endl;
//         return false;
//     }
	
	
	if ( ftp.state() != QFtp::Unconnected )
		ftp.close();
	
	 ftp.connectToHost(url.host(), url.port(21));
	QString user = "****";
	QString pw = "*****";
	ftp.login(user, pw);

    QString path = url.path();
    if (path.isEmpty())
        path = "/";

    pendingDirs.append(path);
    processNextDirectory();

    return true;
}

void Spider::ftpDone(bool error)
{
    if (error) {
        cerr << "Error: " << qPrintable(ftp.errorString()) << endl;
    } else {
        cout << "Downloaded " << qPrintable(currentDir) << " to "
             << qPrintable(QDir::convertSeparators(
                               QDir(currentLocalDir).canonicalPath()));
    }

    qDeleteAll(openedFiles);
    openedFiles.clear();

    processNextDirectory();
}

void Spider::ftpListInfo(const QUrlInfo &urlInfo)
{
    if (urlInfo.isFile()) {
        if (urlInfo.isReadable()) {
            QFile *file = new QFile(currentLocalDir + "/"
                                    + urlInfo.name());

            if (!file->open(QIODevice::WriteOnly)) {
                cerr << "Warning: Cannot open file "
                     << qPrintable(
                            QDir::convertSeparators(file->fileName()))
                     << endl;
                return;
            }

            ftp.get(urlInfo.name(), file);
            openedFiles.append(file);
        }
    } else if (urlInfo.isDir() && !urlInfo.isSymLink()) {
        pendingDirs.append(currentDir + "/" + urlInfo.name());
    }
}

void Spider::processNextDirectory()
{
    if (!pendingDirs.isEmpty()) {
        currentDir = pendingDirs.takeFirst();
        currentLocalDir = "downloads/" + currentDir;
        QDir(".").mkpath(currentLocalDir);

        ftp.cd(currentDir);
        ftp.list();
    } else {
        emit done();
    }
}


Verfasst: 11. September 2007 10:29
von pfusterschmied
Hab den Fehler gefunden!

Die Zeile :

Code: Alles auswählen

if (urlInfo.isReadable()) { .....
überprüft ob das File am Server gelesenwerden kann .... Alle Dateien waren jedoch nur chmod 770 freigegeben .....

Also kein Problem nur Dummheit ..... :roll: