Простой FTP-клиент

Simple FTP client/main.cpp
Simple FTP client/myftp.h
Simple FTP client/myftp.cpp

Библиотека Qt предоставляет высокоуровневый класс QFtp, реализующий функциональность клиента FTP. Работа этого класса асинхронна. Это обеспечивает отсутствие блокировок приложения во время выполнения команд FTP.
В классе QFtp содержатся методы для некоторых команд FTP: connectToHost(), login(), list(), get(), put() и др.
Эти методы исполняют соответствующие команды FTP и возвращают число, являющееся идентификационным номером команды(оно может быть использовано для отслеживания результатов выполнения команд).
Существует возможность указания типа передачи(Ascii или двоичный) и режима(пассивная или активная передача). Метод rawCommand() позволяет выполнить произвольную FTP-команду:

ftp.rawCommand("RMDIR TempDir");

Для использования класса QFtp модуля QtNetwork необходимо добавить следующую строку в файл проекта:
QT += network

Так как графический интерфейс в нашем примере использован не будет, то можно исключить модуль QtGui:
QT -= gui

Рассмотрим код метода getFile() :
bool MyFtp::getFile()
{
file.setFileName("ftpget.txt");
if (!file.open(QIODevice::WriteOnly))
    {
        cerr << "Error: Cannot open local file" << endl;
        return false;
    }
ftp.connectToHost("ftp.trolltech.com");
ftp.login();
ftp.cd("qt");
ftp.get("INSTALL", &file);
ftp.close();
return true;
}

Наиболее распространенной ошибкой является закрытие файла после вызова ftp.close(). Так как класс QFtp работает асинхронно, то это приведет к закрытию файла во время выполнения FTP-команд.
Только при получении сигнала done() от объекта класса QFtp можно быть уверенным, что выполнение команд FTP завершено:
MyFtp::MyFtp(QObject *parent)
    : QObject(parent)
{
    connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
}
void MyFtp::ftpDone(bool error)
{
    if (error) 
    {
        cerr << "Error: " << qPrintable(ftp.errorString()) << endl;
    } 
    else 
    {
        cerr << "File downloaded" <<  endl;
    }
    file.close();
    emit canExit();
}
page_revision: 25, last_edited: 1201421438|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License