Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Класс QFtp поддерживает несколько FTP—команд, включая connectToHost, login, close, list, cd, get, put, remove, mkdir, rmdir и rename. Все эти функции отправляют какую-то команду FTP и возвращают число, идентифицирующее эту команду. Можно также управлять режимом передачи (по умолчанию используется пассивная передача) и типом передачи (двоичный по умолчанию).

Произвольные команды FTP можно выполнять при помощи функции rawCommand. Ниже приводится пример выполнения команды SITE CHMOD:

ftp.rawCommand("SITE CHMOD 755 fortune");

QFtp генерирует сигнал commandStarted(int) в начале выполнения команды и сигнал commandFinished(int, bool) после завершения выполнения команды. Параметр типа int является числом, которое идентифицирует команду. Если мы собираемся отслеживать результаты выполнения отдельных команд, мы можем сохранять эти идентификаторы при постановке команд в очередь. Отслеживание идентификаторов обеспечивает более оперативную обратную связь с пользователем. Например:

01 bool FtpGet::getFile(const QUrl &url)

02 {

03 …

04 connectId = ftp.connectToHost(url.host, url.port(21));

05 loginId = ftp.login;

06 getId = ftp.get(url.path, &file);

07 closeId = ftp.close;

08 return true;

09 }

10 void FtpGet::ftpCommandStarted(int id)

11 {

12 if (id == connectId) {

13 сегг << "Connecting..." << endl;

14 } else if (id == loginId) {

15 cerr << "Logging in..." << endl;

16 …

17 }

Другой способ обеспечения обратной связи заключается в подключении к сигналу stateChanged класса QFtp, который генерируется при всяком изменении состояния соединения (QFtp::Connecting, QFtp::Connected, QFtp::LoggedIn и т.д.).

В большинстве приложений нас интересует только результат исполнения всей последовательности команд, а не каких-то конкретных команд. В таком случае мы можем просто подключить сигнал done(bool), который генерируется всякий раз, когда очередь команд становится пустой.

При возникновении ошибки QFtp автоматически очищает очередь команд. Это означает, что при неудачном подсоединении или входе пользователя в систему оставшиеся в очереди команды никогда не выполнятся. Если мы после возникновения ошибки зададим новые команды с использованием того же объекта QFtp, они будут поставлены в очередь и затем выполнены.

В файл приложения .pro необходимо добавить следующую строку для сборки приложения совместно с библиотекой QtNetwork:

QT += network

Теперь мы рассмотрим более сложный пример. Программа командной строки spider (паук) скачивает все файлы, расположенные в каталоге FTP—сервера, рекурсивно просматривая каждый его подкаталог. Вся логика работы с сетью содержится в классе Spider:

01 class Spider : public QObject

02 {

03 Q_OBJECT

04 public:

05 Spider(QObject *parent = 0);

06 bool getDirectory(const QUrl &url);

07 signals:

08 void done;

09 private slots:

10 void ftpDone(bool error);

11 void ftpListInfo(const QUrlInfo &urlInfo);

12 private:

13 void processNextDirectory;

14 QFtp ftp;

15 QList<QFile *> openedFiles;

16 QString currentDir;

17 QString currentLocalDir;

18 QStringList pendingDirs;

19 };

Начальный каталог определяется как объект типа QUrl и устанавливается при помощи функции getDirectory.

01 Spider::Spider(QObject *parent)

02 : QObject(parent)

  • Читать дальше
  • 1
  • ...
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: