[qt][c++] QFtp

0

Witam Serdecznie

W swoim programie potrzebuję pobrać plik tekstowy z serwera ftp, niestety coś u mnie nie gra z tym. Oto funkcja odpowiedzialna za ściąganie danych:

class MainWindow : public QMainWindow
{
private:
	QFtp *ftp;
	QFile *ftpFile;
};
void MainWindow::get()
{
	ftpFile = new QFile("test.txt");
	ftp = new QFtp(this);

	ftpFile->open(QIODevice::ReadWrite | QIODevice::Text);
	ftp->connectToHost("ftp.trolltech.com", 21);
	ftp->login();
	ftp->cd("qt");
	ftp->get("INSTALL", ftpFile);

	ftp->close();
	ftpFile->close();
}

Na dysku powstaje pusty plik tekstowy.
Pozdrawiam

0

no bo zamykasz połączenie ftp i plik zanim cokolwiek zostnie ściągnięte. ftp->get jest poleceniem ASYNCHRONICZNYM.
Popatrz do dokumentacji.
Powinno to być tak:

void MainWindow::get()
{
        QFile* ftpFile = new QFile("test.txt");
        ftp = new QFtp(this);

        ftpFile->open(QIODevice::ReadWrite | QIODevice::Text);
        ftp->connectToHost("ftp.trolltech.com", 21);
        ftp->login();
        ftp->cd("qt");
        ftp->get("INSTALL", ftpFile);

        connect(ftp, SIGNAL(commandFinished()),
                 ftpFile, SLOT(close()));
        connect(ftp, SIGNAL(commandFinished()),
                 ftpFile, SLOT(deleteLater()));

        connect(ftp, SIGNAL(commandFinished()),
                 ftp, SLOT(close()));
        connect(ftp, SIGNAL(commandFinished()),
                 ftp, SLOT(deleteLater()));
}
0
MarekR22 napisał(a)

no bo zamykasz połączenie ftp i plik zanim cokolwiek zostnie ściągnięte. ftp->get jest poleceniem ASYNCHRONICZNYM.
Popatrz do dokumentacji.

Zakomentowanie linijki, która odpowiada zamknięciu połączenia nie przynosi efektu. Podany przykład jest praktycznie skopiowany z dokumentacji jednak u mnie nie wykonuje się poprawnie.

0

a plik INSTALL nie ma żadnego rozszerzenia?

0
Blood napisał(a)

a plik INSTALL nie ma żadnego rozszerzenia?

Właśnie, że nie ma oto link do niego: ftp://ftp.trolltech.com/qt/INSTALL

0

Napisz jaki błąd wyrzuca Ci funkcja get, czyli:

int blad = ftp->get("INSTALL", ftpFile);

i wypisz sobie blad.

0

Dobra, sam powinienem doczytać dokumentację.

  1. Wszystkie, operacje na QFtp są asynchroniczne. Wywołując metodę dla danej operacji jedynie jest ona dodawana do kolejki operacji do zrobienia (zwracany jest identyfikator zlecenia, a nie błąd).
  2. postęp wykonania jest sygnalizowany przez sygnały
  3. jeśli jakaś operacja się nie powiedzie, wszystkie następne zlecenia operacji są anulowane (kolejka jest czyszczona).
  4. poniższy kod działa (testowałem):
void MainWindow::on_pushButton_clicked()
{
    QFtp *ftp=new QFtp(this);
    QFile *file=new QFile("INSTALL-ftp.txt", ftp);
    file->open(QIODevice::WriteOnly | QIODevice::Text);

    connect(ftp, SIGNAL(commandStarted(int)),
            this, SLOT(printStarted(int)));
    connect(ftp, SIGNAL(commandFinished(int,bool)),
            this, SLOT(printFinished(int,bool)));
    connect(ftp, SIGNAL(stateChanged(int)),
            this, SLOT(printStatus(int)));
    connect(ftp, SIGNAL(done(bool)),
            ftp, SLOT(deleteLater()));

    ftp->connectToHost("ftp.trolltech.com", 21);
    ftp->login();
    ftp->cd("qt");
    ftp->get("INSTALL", file);
    ftp->close();
}


void MainWindow::printStarted(int id)
{
    ui->textEdit->append(QString("started %1").arg(id));
}

void MainWindow::printFinished(int id, bool error)
{
    QFtp *ftp = qobject_cast<QFtp*>(sender());
    if (error) {
        ui->textEdit->append(QString("Failed %1, error %2").arg(id).arg(ftp->error()));
    } else {
        ui->textEdit->append(QString("Success %1").arg(id));
    }
}

void MainWindow::printStatus(int status)
{
    static const char* const states[] = {
        "Unconnected",
        "HostLookup",
        "Connecting",
        "Connected",
        "LoggedIn",
        "Closing",
        " --- uknown --- "
    };

    ui->textEdit->append(states[qBound(0,status,6)]);
}

Postępy ściągania widać w edytorze, który sobie dodałem i po wykonaniu wszystkich operacji widzę w nim:

started 1
HostLookup
Connecting
Connected
Success 1
started 2
LoggedIn
Success 2
started 3
Success 3
started 4
Success 4
started 5
Closing
Unconnected
Success 5

1 użytkowników online, w tym zalogowanych: 0, gości: 1