Russian Qt Forum
Ноябрь 24, 2024, 06:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка файлов в разные директории  (Прочитано 4690 раз)
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 (первый файл), закачка и запись остальных файлов не начнется. Но как это сделать?
Или я брежу?
Записан
Rem Norton
Гость
« Ответ #1 : Сентябрь 15, 2011, 20:46 »

Вот тут: http://www.prog.org.ru/index.php?topic=18601.msg131162#msg131162 я выложил класс, который должен помочь. Будут вопросы - отвечу.
Записан
yandzee
Гость
« Ответ #2 : Сентябрь 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));
?
Записан
Rem Norton
Гость
« Ответ #3 : Сентябрь 15, 2011, 21:17 »

В принципе да. Это условный цикл для синхронизации ассинхронных потоков (Я НИЧЕГО НЕ КУРИЛ  Смеющийся). Еще немаловажно не забыть
выставить в слотах bReaded, bTimeout, bAbort или bNetError иначе цикл будет вечным.


P.S. Для описанной задачи вполне подойдет весь класс целиком.
Записан
yandzee
Гость
« Ответ #4 : Сентябрь 15, 2011, 21:21 »

Спасибо большое!
Записан
Rem Norton
Гость
« Ответ #5 : Сентябрь 15, 2011, 21:29 »

Не за что.

Единственный момент упустил: если класс не планируется использовать в скрипте, то, чтобы не подключать QtScript  к проекту, надо сделать вот что:

1. из httpclient.h убрать "#include <QtScript>"
2. в httpclient.h "class QHttpClient : public QObject, public QScriptable" заменить на "class QHttpClient : public QObject".
Записан
yandzee
Гость
« Ответ #6 : Сентябрь 15, 2011, 21:48 »

Уже сделал. Спасибо!
В своей программе убрал весь код по закачке.
Написал
QHttpClient *pclient = QHttpClient;
plient->getFile("journal.j-art.ru/p/titles.txt", "titles.txt");
Запустил, подождал, смотрю файл titles.txt есть но он пустой.
Записан
Rem Norton
Гость
« Ответ #7 : Сентябрь 16, 2011, 08:47 »

А что сказал QHttpClient? может таймаут?
По умолчанию таймаут 30 сек. Если за это время файл не скачался, то он обрывается.
Код
C++ (Qt)
bool getFile(QString cURL, QString cFileName, int Timeout = 30);
 
Хотя там 626 байт...

можно сделать так:
Код
C++ (Qt)
QHttpClient *pclient = QHttpClient;
if (plient->getFile("journal.j-art.ru/p/titles.txt", "titles.txt")) qDebug("Ok");
else
{
  if (plient->hasError()) qDebug() << plient->lastError();
  else qDebug("Unknown error");
}
 
 

И посмотреть, что напишет в консоль.
Записан
yandzee
Гость
« Ответ #8 : Сентябрь 16, 2011, 17:49 »

Чуть изменил код, теперь закачка работает, все отлично, но файлы пишутся в папку, где лежит exe файл, а не в папку, в которую я перешел QDir::cd().
Сделал вывод в консоль, пишет что находится в нужной директории, но на самом деле пишутся файлы не туда. Зашел в httpclient.cpp и изменил строку
QString cFilePath = cFileName;
А так же убрал QDir dir = QCoreApplication::applicationDirPath(); что то вроде того, но это не помогает.
Записан
Rem Norton
Гость
« Ответ #9 : Сентябрь 16, 2011, 20:07 »

Надо заменить в  getFile(QString cURL, QString cFileName, int Timeout):
Код
C++ (Qt)
QDir dir(QCoreApplication::applicationDirPath());
QString cFilePath = dir.absoluteFilePath(cFileName);
 

на

Код
C++ (Qt)
QString cFilePath = cFileName;
 

или cFileName задавать в виде пути относительно exe-шника (класс делался для работы в скрипте, пути относительно exe-шника). Например так :"../../../mydir/myfile.zip".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.113 секунд. Запросов: 21.