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

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

Шрифт:

01 void Spider::ftpDone(bool error)

02 {

03 if (error) {

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

05 } else {

06 cout << "Downloaded " << qPrintable(currentDir) << " to "

07 << qPrintable(QDir::convertSeparators(

08 QDir(currentLocalDir).canonicalPath));

09 }

10 qDeleteAll(openedFiles);

11 openedFiles.clear;

12 processNextDirectory;

13 }

Слот ftpDone вызывается после завершения всех команд FTP или при возникновении ошибки. Мы удаляем объекты QFile для предотвращения утечек памяти, а также для закрытия всех файлов. Наконец, мы вызываем функцию processNextDirectory. Если какие-нибудь каталоги остались, весь процесс повторяется для следующего каталога в списке; в противном случае скачивание файлов прекращается и генерируется сигнал done.

Если ошибок нет, последовательность команд FTP и сигналов будет такой:

connectToHost(host, port)

login

cd(directory_1)

list

emit listInfo(file_1_1)

get(file_1_1)

emit listInfo(file_1_2)

get(file_1_2)

…

emit done

…

cd(directory_N)

list

emit listInfo(file_N_1)

get(file_N_1)

emit listInfo(file_N_2)

get(file_N_2)

…

emit done

Если файл фактически оказывается каталогом, он добавляется в список pendingDirs и, когда завершается скачивание последнего файла, полученного текущей командой list, выдается новая команда cd, за которой следует новая команда list для следующего каталога, ожидающего обработки, и весь процесс повторяется для нового каталога. Скачиваются новые файлы, и в список pendingDirs добавляются новые каталоги до тех пор, пока не будут скачаны все файлы из всех каталогов и список pendingDirs в результате не станет пустым.

Если возникнет сетевая ошибка при загрузке пятого файла, скажем, из двадцати файлов в каталоге, остальные файлы не будут скачаны. Если бы мы захотели скачать как можно больше файлов, то один из способов заключается в выполнении по одной операции GET и ожидании сигнала done(bool) перед выполнением новой операции GET. В функции listInfo мы бы просто добавили имя файла в конец списка QStringList вместо немедленного вызова get, а в слоте done(bool) мы бы вызывали функцию get для следующего загружаемого файла из списка QStringList. Последовательность команд выглядела бы так:

connectToHost(host, port)

login

cd(directory_1)

list

…

cd(directory_N)

list

emit listInfo(file_1_1)

emit listInfo(file_1_2)

…

emit listInfo(file_N_1)

emit listInfo(file_N_2)

…

emit done

get(file_1_1)

emit done

get(file_1_2)

emit done

…

get(file_N_1)

emit done

get(file_N_2)

emit done

…

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

01 int main(int argc, char *argv[])

02 {

03 QCoreApplication app(argc, argv);

04 QStringList args = app.arguments;

05 if (args.count != 2) {

06 cerr << "Usage: spider url" << endl << "Example:" << endl

07 << " spider ftp://ftp.trolltech.com/freebies/leafnode" << endl;

08 return 1;

09 }

10 Spider spider;

11 if (!spider.getDirectory(QUrl(args[1])))

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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