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(); }





