QFtp - czekanie na pobranie pliku

Odpowiedz Nowy wątek
2014-12-14 19:59
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.

Pozostało 580 znaków

2014-12-15 10:23

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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
@MarekR22 a to w którym momencie mam zamykać plik ?? - maniek1310 2014-12-16 17:45
jak dostaniesz sygnał, że pobranie zostało ukończone, czyli w printFinished sprawdzasz wartość identyfikatora i jeśli się zgadza to zamykasz plik. - MarekR22 2014-12-16 17:47
jeżeli zamienię to connect(ftp, SIGNAL(done(bool)), file, SLOT(deleteLater())); na zamykanie pliku file.close(); we funkcji printFinished to rozmiar pliku wynosi 0 - maniek1310 2014-12-16 17:50
a sprawdziłeś identyfikator? - MarekR22 2014-12-16 17:54
napiszę posta, bo chcę wkleić kawałek kodu - maniek1310 2014-12-16 17:56

Pozostało 580 znaków

2014-12-15 17:20
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.

Pozostało 580 znaków

2014-12-16 17:58
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();
}

Pozostało 580 znaków

2014-12-16 18:02
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
        }
    }
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2014-12-16 21:33
@MarekR22 nie uwierzysz co było problemem :) if(id = file_get) :D - maniek1310 2014-12-16 19:00
dodaj do pro: QMAKE_CXXFLAGS += -Wall a kompilator to wyłapie. - MarekR22 2014-12-16 21:32

Pozostało 580 znaków

2014-12-16 18:06
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()

edytowany 1x, ostatnio: maniek1310, 2014-12-16 18:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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