QFtp - czekanie na pobranie pliku

0

Witam, jak zrobić aby program czekał na pobranie pliku log.txt z serwera ftp i dopiero na nim działał. Bo na razie to program go otwiera bez czekania aż się pojawi.

Kod programu

#include "metin2_patcher.h"
#include "ui_metin2_patcher.h"

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

    log = 0;

    file = new QFile("E:/log.txt");
    file->open(QIODevice::WriteOnly);

    connect_ftp_serwer();

    ftp->cd("Dreikonv2");
    ftp->list();
    ftp->get("log.txt", file);

    disconnect_ftp_serwer();

    file2 = new QFile("D:/config.exe");

    file2->open(QIODevice::ReadOnly);
}

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

void metin2_patcher::connect_ftp_serwer()
{
    ftp = new QFtp(this);

    connect(ftp, SIGNAL(listInfo(QUrlInfo)), this, SLOT(readList(QUrlInfo)));
    connect(ftp, SIGNAL(dataTransferProgress(qint64,qint64)), this, SLOT(dataProcess(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)), file, SLOT(deleteLater()));

    ftp->connectToHost("ip", 21);
    ftp->login("login", "haslo");
}

void metin2_patcher::disconnect_ftp_serwer()
{
    ftp->close();
}

void metin2_patcher::readList(QUrlInfo urlInfo)
{
    if(urlInfo.isDir())
        qDebug() << "[FOLDER]" << " nazwa pliku : " << urlInfo.name() << " rozmiar pliku : " << urlInfo.size();
    else if(urlInfo.isFile())
        qDebug() << "[PLIK]" << " nazwa pliku : " << urlInfo.name() << " rozmiar pliku : " << urlInfo.size();
}

void metin2_patcher::dataProcess(qint64 act, qint64 size)
{
    qDebug() << "Pobrano : " << act << " z : " << size;
}

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

void metin2_patcher::printStatus(int status)
{
    static const char* const p_status[] = {
        "Unconnected",
        "HostLookup",
        "Connecting",
        "Connected",
        "LoggedIn",
        "Closing",
        "order"
    };

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

void metin2_patcher::printFinished(int id, bool error)
{
    if(error)
        qDebug() << "Failed : " << id << " error : " << ftp->error();
    else
        qDebug() << "printFinished Success : " << id;

    if(id == 6)
        crc16_sum(file2->read(524288));
}

void metin2_patcher::on_button_exit_clicked()
{
    close();
}

void metin2_patcher::crc16_sum(QByteArray byte)
{
    quint16 crcSum = qChecksum(byte.data(), byte.length());

    qDebug() << "crcSum : " << hex << crcSum << " : " << dec << crcSum;
}

Zrobiłem tak ale wyskakuje rozmiar 0.

EventLoop = new QEventLoop();
    connect(ftp, SIGNAL(commandFinished(int,bool)), EventLoop, SLOT(quit()));
    ftp->get("log.txt", file);
    EventLoop->exec();
    delete EventLoop;

    qDebug() << file->size();

Ps. Sorry, zamiast do tamtego postu dołączyć zrobiłem nowy. Niech moderator scali.

1

ftp->get("log.txt", file); zwraca ci identyfikator zleconego zadania! Zapamiętaj go, a potem gdy dostaniesz sygnał commandFinished z tym identyfikatorem i potwierdzeniem sukcesu wykonaj właściwe przetwarzanie.

Poza tym, zamykasz plik natychmiast tymczasem wszystkie operacje na ftp są asynchroniczne i są kolejkowane. Czyli zamykasz plik, w którym chcesz zapisać pobrane dane, zanim zalogujesz się do serwera.

0

@MarekR22 wczoraj sam właśnie o tym doczytałem w dokumentacji ale robiłem, że policzyłem jakie będzie miało id i ręcznie przypisałem, że jak będzie id 5 to wykonaj funkcję. Ale twój sposób jest bezpieczniejszy i o wiele lepszy.

0

@MarekR22 tak 5 = 5 :D, zrobiłem że zamyka plik i rozmiar pliku jest prawidłowy ale po zamknięciu jak chcę go otworzyć to już jest lipa, bo pokazuje że nadal jest otwarty.

void metin2_patcher::printFinished(int id, bool error)
{
    if(error)
        qDebug() << "Failed : " << id << " error : " << ftp->error();
    else
        qDebug() << "printFinished Success : " << id;

    qDebug() << file_get << " : " << id;

    if(id = file_get) // 5 = 5
    {
        connect(ftp, SIGNAL(done(bool)), file, SLOT(deleteLater()));
        check_log();
    }

    if(id == 6)
        crc16_sum(file2->read(524288));
}
void metin2_patcher::check_log()
{
    QFile check("log_ftp.txt");
    QFile check2("log.txt");

    qDebug() << "check_log";

    if(file->isOpen())
        qDebug() << "Plik otwarty";
    else
        qDebug() << "Plik zamknięty";

    if(!check2.open(QIODevice::ReadOnly))
        qDebug() << "Nie można otworzyć pliku log.txt";

    if(!check.open(QIODevice::ReadOnly))
        qDebug() << "Nie można otworzyć pliku log_ftp.txt";

    QTextStream in(&check);

    while(!in.atEnd())
    {
        QString line = in.readAll();
        qDebug() << line;
    }

    check.close();
    check2.close();
}
0

Po kiego grzyba ten connect?

void metin2_patcher::printFinished(int id, bool error)
{
    if(error)
        qDebug() << "Failed : " << id << " error : " << ftp->error();
    else
        qDebug() << "printFinished Success : " << id;
 
    qDebug() << file_get << " : " << id;
 
    if(id == file_get)  {
        file->close();
        if (file->open(QFile::ReadOnly)) { // nie jestem pewien, czy można tym samym obiektem otwierać
             crc16_sum(file->read(524288)); // nie wiem co to za magię tu wyprawiasz
        }
    }
}
0

@MarekR22 W tym problem, że jak zrobię tak jak napisałeś to rozmiar pliku wynosi 0.

Ps. a jeżeli chodzi o tą funkcję crc16_sum to w tej funkcji printFinished tylko dla testu była dodana, będzie ona sprawdzała sumę plików crc we funkcji check_log()

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