Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

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

02 {

03 if (!url.isValid) {

04 cerr << "Error: Invalid URL" << endl;

05 return false;

06 }

07 if (url.scheme != "ftp") {

08 cerr << "Error: URL must start with 'ftp:'" << endl;

09 return false;

10 }

11 if (url.path.isEmpty) {

12 cerr << "Error: URL has no path" << endl;

13 return false;

14 }

15 QString localFileName = QFileInfo(url.path).fileName;

16 if (localFileName.isEmpty)

17 localFileName = "ftpget.out";

18 file.setFileName(localFileName);

19 if (!file.open(QIODevice::WriteOnly)) {

20 cerr << "Error: Cannot open "

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) в конструкторе.

01 void FtpGet::ftpDone(bool error)

02 {

03 if (error) {

04 cerr << "Error: " << qPrintable(ftp.errorString) << endl;

05 } else {

06 cerr << "File downloaded as " << qPrintable(file.fileName) << endl;

07 }

08 file.close;

09 emit done;

10 }

После

выполнения всех команд 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 является числом, которое идентифицирует команду. Если мы собираемся отслеживать результаты выполнения отдельных команд, мы можем сохранять эти идентификаторы при постановке команд в очередь. Отслеживание идентификаторов обеспечивает более оперативную обратную связь с пользователем. Например:

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 и т.д.).

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

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник