QFtp - pobieranie pliku a rozmiar 0 kb

0

Witam, mam napisany kod, którym łącze się z serwerem ftp, ale gdy chcę pobrać plik to tworzy się on na dysku ale pusty. Dodam jeszcze, że jak używam sygnału dataTransferProgress to pokazuje prawidłowo, że pobrano plik.

Tutaj macie to co wypisuje :

started 1 
HostLookup 
Connecting 
Connected 
Success 1 
started 2 
LoggedIn 
Success 2 
started 3 
Success 3 
started 4 
Pobrano :  0  z  342 
Pobrano :  342  z  342 
Success 4 
started 5 
Closing 
Unconnected 
Success 5 

A tutaj kod programu :
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUrlInfo>
#include <QDebug>
#include <QFile>
#include <QFtp>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void readList(QUrlInfo urlInfo);
    void ile(qint64 akt, qint64 max);
    void printStarted(int id);
    void printFinished(int id, bool error);
    void printStatus(int status);

private:
    Ui::MainWindow *ui;
    QFtp *ftp;
    QFile *test;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    test = new QFile(QString("D:/plik.cfg"));

    test->open(QIODevice::ReadWrite | QIODevice::Text);

    ftp = new QFtp(this);

    connect(ftp, SIGNAL(listInfo(QUrlInfo)), this, SLOT(readList(QUrlInfo)));
    connect(ftp, SIGNAL(dataTransferProgress(qint64,qint64)), this, SLOT(ile(qint64, qint64)));
    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("ip.net", 21);
    ftp->login("login", "haslo");
    ftp->cd("test");
    ftp->get("plik.cfg", test);
    ftp->close();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readList(QUrlInfo urlInfo)
{
    qDebug() << "Nazwa pliku : " << urlInfo.name() << " rozmiar pliku : " << urlInfo.size();
}

void MainWindow::on_pushButton_clicked()
{

}

void MainWindow::ile(qint64 akt, qint64 max)
{
    qDebug() << "Pobrano : " << akt << " z " << max;
}

void MainWindow::printStarted(int id)
{
    qDebug() << "started" << id;
}

void MainWindow::printFinished(int id, bool error)
{
    QFtp *ftp = qobject_cast<QFtp*>(sender());
    if (error) {
        qDebug() << "Failed : " << id << " error : " << ftp->error();
    } else {
        qDebug() << "Success" << id;
    }
}

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

    qDebug() << states[qBound(0, status, 6)];
}
0

Wie ktoś jak zrobić żeby to działało ?? Męczę się z tym od dwóch dni i ciągle bez rezultatu.

0

W którym miejscu zapisujesz coś do tego pliku?

1

brakuje:

connect(ftp, SIGNAL(readyRead()), this, SLOT(readAndSaveData()));
…
void MainWindow::readAndSaveData() {
     test->write(ftp->readAll());
}

Brak też zamknięcia pliku!

0

@MarekR22 Nadal to samo, dla pewności po zamknięciu ftp zamknąłem też plik ale nie pomogło.

1

Dobra sam przetestowałem.

  1. ten kod, który dałem, jest zbędny (ponieważ get dostało wskaźnik device'a)
  2. problemem jest brak zamykania pliku (pisałem o tym na samym początku), na dodatek masz wyciek pamięci z test. Można to załatwić prostym connect:
connect(ftp, SIGNAL(done(bool)), test, SLOT(deleteLater()));

destruktor automatycznie zamyka otwarty plik.

0

@MarekR22 dzięki za pomoc, działa :D Teraz na przyszłość będę pamiętał. Mógłbyś jeszcze dokładnie opisać co robi ten deleteLater() ??

1

deleteLater jest dobrze opisane w dokumentacji.
Generalnie chodzi o to, że obiekt zostanie zniszczony nie w momencie nadejścia sygnału, ale przy następnej iteracji bieżącego event loopa.

0

Mój problem polega na tym, że nie znam języka Angielskiego, dlatego trudno mi przychodzi tłumaczenie dokumentacji :)

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