Название: Загрузка файлов в разные директории Отправлено: yandzee от Сентябрь 15, 2011, 20:22 Здравствуйте!
Подскажите, как можно разрешить следующую проблему: Нужно скачать один файл и поместить его в директорию \folder Затем нужно скачать еще много файлов (.html) и поместить их в \folder\folder1 Я это делаю так: reply = accessmanager->get("http://server.ru/file.txt"); connect(reply, SIGNAL(readyRead()), SLOT(readData1())); //переход в другую директорию for(int i =1;i<N;i++) { reply = accessmanager->get("http://server.ru/"+QString::number(i)+".html"); connect(reply, SIGNAL(readyRead()), SLOT(readData2())); } Естественно, сигнал readyRead высылается почти не сразу. Под почти я подразумеваю то, что пока это произойдет программа уже поменяет директорию. После закачки, у меня почему то два файла обрублены, то есть в них не полный текст - какая то часть. Нужно сделать как то так, чтобы закачка шла последовательно, то есть пока не скачается и не запишется file.txt (первый файл), закачка и запись остальных файлов не начнется. Но как это сделать? Или я брежу? Название: Re: Загрузка файлов в разные директории Отправлено: Rem Norton от Сентябрь 15, 2011, 20:46 Вот тут: http://www.prog.org.ru/index.php?topic=18601.msg131162#msg131162 (http://www.prog.org.ru/index.php?topic=18601.msg131162#msg131162) я выложил класс, который должен помочь. Будут вопросы - отвечу.
Название: Re: Загрузка файлов в разные директории Отправлено: yandzee от Сентябрь 15, 2011, 21:12 Ух!
Как я понял, почти вся соль :) в connect(reply, SIGNAL(readyRead()),this, SLOT(httpReadyRead())); connect(reply, SIGNAL(finished()),this, SLOT(httpFinished())); ........... do { QCoreApplication::processEvents(); } while(!(bReaded || bTimeout || bAbort || bNetError)); ? Название: Re: Загрузка файлов в разные директории Отправлено: Rem Norton от Сентябрь 15, 2011, 21:17 В принципе да. Это условный цикл для синхронизации ассинхронных потоков (Я НИЧЕГО НЕ КУРИЛ ;D). Еще немаловажно не забыть
выставить в слотах bReaded, bTimeout, bAbort или bNetError иначе цикл будет вечным. P.S. Для описанной задачи вполне подойдет весь класс целиком. Название: Re: Загрузка файлов в разные директории Отправлено: yandzee от Сентябрь 15, 2011, 21:21 Спасибо большое!
Название: Re: Загрузка файлов в разные директории Отправлено: Rem Norton от Сентябрь 15, 2011, 21:29 Не за что.
Единственный момент упустил: если класс не планируется использовать в скрипте, то, чтобы не подключать QtScript к проекту, надо сделать вот что: 1. из httpclient.h убрать "#include <QtScript>" 2. в httpclient.h "class QHttpClient : public QObject, public QScriptable" заменить на "class QHttpClient : public QObject". Название: Re: Загрузка файлов в разные директории Отправлено: yandzee от Сентябрь 15, 2011, 21:48 Уже сделал. Спасибо!
В своей программе убрал весь код по закачке. Написал QHttpClient *pclient = QHttpClient; plient->getFile("journal.j-art.ru/p/titles.txt", "titles.txt"); Запустил, подождал, смотрю файл titles.txt есть но он пустой. Название: Re: Загрузка файлов в разные директории Отправлено: Rem Norton от Сентябрь 16, 2011, 08:47 А что сказал QHttpClient? может таймаут?
По умолчанию таймаут 30 сек. Если за это время файл не скачался, то он обрывается. Код Хотя там 626 байт... можно сделать так: Код
И посмотреть, что напишет в консоль. Название: Re: Загрузка файлов в разные директории Отправлено: yandzee от Сентябрь 16, 2011, 17:49 Чуть изменил код, теперь закачка работает, все отлично, но файлы пишутся в папку, где лежит exe файл, а не в папку, в которую я перешел QDir::cd().
Сделал вывод в консоль, пишет что находится в нужной директории, но на самом деле пишутся файлы не туда. Зашел в httpclient.cpp и изменил строку QString cFilePath = cFileName; А так же убрал QDir dir = QCoreApplication::applicationDirPath(); что то вроде того, но это не помогает. Название: Re: Загрузка файлов в разные директории Отправлено: Rem Norton от Сентябрь 16, 2011, 20:07 Надо заменить в getFile(QString cURL, QString cFileName, int Timeout):
Код
на Код
или cFileName задавать в виде пути относительно exe-шника (класс делался для работы в скрипте, пути относительно exe-шника). Например так :"../../../mydir/myfile.zip". |