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

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

Шрифт:

03 {

04 connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));

05 connect(&ftp, SIGNAL(listInfo(const QUrlInfo &)),

06 this, SLOT(ftpListInfo(const QUrlInfo &)));

07 }

В конструкторе мы устанавливаем два соединения сигнал—слот. Когда мы выдаем запрос на получение списка элементов каталога в getDirectory, QFtp генерирует сигнал listInfo(const QUrlInfo &) для каждого найденного имени. Этот сигнал подключается к слоту с именем ftpListInfo, который скачивает файл из сети по указанному адресу URL.

01 bool Spider::getDirectory(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 ftp.connectToHost(url.host, url.port(21));

12 ftp.login;

13 QString path = url.path;

14 if (path.isEmpty)

15 path = "/";

16 pendingDirs.append(path);

17 processNextDirectory;

18 return true;

19 }

Выполнение функции getDirectory начинается с некоторых основных проверок, и если все нормально, делается попытка установить FTP—соединение. Она отслеживает пути, которые необходимо будет обрабатывать, и вызывает функцию processNextDirectory, чтобы начать скачивание корневого каталога.

01 void Spider::processNextDirectory

02 {

03 if (!pendingDirs.isEmpty) {

04 currentDir = pendingDirs.takeFirst;

05 currentLocalDir = "downloads/" + currentDir;

06 QDir(".").mkpath(currentLocalDir);

07 ftp.cd(currentDir);

08 ftp.list;

09 } else {

10 emit done;

11 }

12 }

Функция processNextDirectory принимает первый удаленный каталог из списка каталогов, ожидающих обработки, pendingDirs, и создает соответствующий каталог в локальной файловой системе. После этого она указывает объекту QFtp на необходимость изменения каталога на принятый ею каталог и затем получения списка его файлов. Для каждого файла, обрабатываемого функцией list, генерируется сигнал listInfo, приводящий к вызову слота ftpListInfo.

Когда все каталоги оказываются обработанными, эта функция генерирует сигнал done, обозначающий завершение скачивания.

01 void Spider::ftpListInfo(const QUrlInfo &urlInfo)

02 {

03 if (urlInfo.isFile) {

04 if (urlInfo.isReadable) {

05 QFile *file = new QFile(currentLocalDir + "/"

06 + urlInfo.name);

07 if (!file->open(QIODevice::WriteOnly)) {

08 cerr << "Warning: Cannot open file << qPrintable(

09 QDir::convertSeparators(file->fileName))

10 << endl;

11 return;

12 }

13 ftp.get(urlInfo.name, file);

14 openedFiles.append(file);

15 }

16 } else if (urlInfo.isDir && !urlInfo.isSymLink) {

17 pendingDirs.append(currentDir + "/" + urlInfo.name);

18 }

19 }

Параметр urlInfo слота ftpListInfo содержит информацию о файле в сети. Если это обычный файл (не каталог) и его можно считывать, мы вызываем функцию get для его загрузки. Объект QFile, используемый для загрузки файла, создается с помощью оператора new, и указатель на него хранится в списке openedFiles.

Если содержащиеся в QUrlInfo сведения об удаленном каталоге говорят, что он не является символической связью, этот каталог добавляется к списку pendingDirs. Мы пропускаем символические связи, поскольку они легко могут привести к бесконечной рекурсии.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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