21 << qPrintable(file.fileName) << " for writing: "
22 << qPrintable(file.errorString) << endl;
23 return false;
24 }
25 ftp.connectToHost(url.host, url.port(21));
26 ftp.login;
27 ftp.get(url.path, &file);
28 ftp.close;
29 return true;
30 }
Функция getFile
начинается с проверки переданного ей URL. Если возникла проблема, функция выводит в поток cerr сообщение об ошибке и возвращает false, указывая на неудачное скачивание файла.
Мы не обязываем пользователя указывать имя локального файла и пытаемся сами создать осмысленное имя на основе URL, а при неудаче используем имя ftpget.out. Если не удается открыть файл, мы печатаем сообщение об ошибке и возвращаем false.
Затем мы выполняем последовательность из четырех команд FTP, используя наш объект QFtp. Вызов url.port(21) возвращает номер порта, указанный в URL, или порт 21, если URL не содержит порта. Поскольку функции login не передаются ни имя пользователи, ни пароль, делается попытка анонимного входа в систему. Второй аргумент функции get задает выходное устройство ввода—вывода.
Команды FTP ставятся в очередь и обрабатываются в цикле обработки событий Qt. Завершение всех команд регистрируется сигналом done(bool) объекта QFtp, который мы подсоединили к слоту ftpDone(bool) в конструкторе.
выполнения всех команд FTP мы закрываем файл и генерируем сигнал done. Может показаться странным, что мы закрываем файл именно здесь, а не после вызова ftp.close в конце функции getFile, но следует помнить, что команды FTP выполняются асинхронно и их выполнение вполне может быть еще не закончено после возврата управления функцией getFile. Только после генерации объектом QFtp сигнала done мы можем быть уверены, что скачивание файла завершено и теперь можно спокойно закрывать файл.
Класс 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 является числом, которое идентифицирует команду. Если мы собираемся отслеживать результаты выполнения отдельных команд, мы можем сохранять эти идентификаторы при постановке команд в очередь. Отслеживание идентификаторов обеспечивает более оперативную обратную связь с пользователем. Например:
Другой способ обеспечения обратной связи заключается в подключении к сигналу stateChanged класса QFtp, который генерируется при всяком изменении состояния соединения (QFtp::Connecting, QFtp::Connected, QFtp::LoggedIn и т.д.).