Russian Qt Forum

Qt => Работа с сетью => Тема начата: bladeser от Июль 07, 2010, 08:50



Название: фтп: сохранение не в файл
Отправлено: bladeser от Июль 07, 2010, 08:50
Извините за тупой вопрос но как организовать закачку текстового файла с фтп не в файл а например в QString?
Пока не придумал ничего лучше как ftp->QBuffer -> QString. Может есть путь короче?


Название: Re: фтп: сохранение не в файл
Отправлено: eugene от Июль 07, 2010, 09:30
Цитировать
int QFtp::get ( const QString & file, QIODevice * dev = 0, TransferType type = Binary )
Downloads the file file from the server.

If dev is 0, then the readyRead() signal is emitted when there is data available to read. You can then read the data with the read() or readAll() functions.

Когда dev = 0 ждем прихода сигнала readyRead и считываем в буфер с помощью readAll()


Название: Re: фтп: сохранение не в файл
Отправлено: SABROG от Июль 07, 2010, 09:35
int QFtp::get ( const QString & file, QIODevice * dev = 0, TransferType type = Binary )

Вместо QIODevice передать QTextStream, которому в конструктор был передан указатель на QString. Соответственно подключаем сигнал void QFtp::commandFinished ( int id, bool error )   [signal] к своему слоту и получаем полностью скаченные данные в своем QString'e.


Название: Re: фтп: сохранение не в файл
Отправлено: bladeser от Июль 07, 2010, 09:48
А разве можно вместо QIODevice передавать QTextStream? Попробую. Подскажите еще чем лучше пользоваться QFtp или QNetworkAccessManager? Я прочитал что QFtp и QHttp остались в qt4 только ради совместимости.


Название: Re: фтп: сохранение не в файл
Отправлено: SABROG от Июль 07, 2010, 14:54
Подскажите еще чем лучше пользоваться QFtp или QNetworkAccessManager? Я прочитал что QFtp и QHttp остались в qt4 только ради совместимости.

Про QFtp нигде не сказано, что он Deprecated, хотя думаю это вопрос времени. Где-то видел, что с помощью QNetworkAccessManager нельзя реализовать докачку контента после обрыва связи, а с классом QFtp вроде можно. Поэтому если хочется идти в ногу со временем и пока не планируется реализовывать докачку файлов, то лучше использовать QNetworkAccessManager, тем более, что потом не придется делать рефакторинг кода.


Название: Re: фтп: сохранение не в файл
Отправлено: bladeser от Июль 09, 2010, 07:59
Нарисовал через QNetworkAccessManager. И появился новый вопрос. Некоторые файлы не помещаются в QString. Что посоветуете в темп файл писать, а потом читать или лучше в массив?


Название: Re: фтп: сохранение не в файл
Отправлено: BRE от Июль 09, 2010, 08:04
Нарисовал через QNetworkAccessManager. И появился новый вопрос. Некоторые файлы не помещаются в QString. Что посоветуете в темп файл писать, а потом читать или лучше в массив?
А если файлы будут по 100Гб...
IMHO, полученный кусок сразу писать в файл и забывать о нем, не нужно память занимать.


Название: Re: фтп: сохранение не в файл
Отправлено: SABROG от Июль 09, 2010, 08:08
Нарисовал через QNetworkAccessManager. И появился новый вопрос. Некоторые файлы не помещаются в QString. Что посоветуете в темп файл писать, а потом читать или лучше в массив?
Какого же размера файлы? Значит сохраняй во временный файл и вызывай

uchar * QFile::map ( qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions )

а потом работай как с массивом "uchar *".


Название: Re: фтп: сохранение не в файл
Отправлено: bladeser от Июль 09, 2010, 08:20
Файлы не сильно большие. Просто немного больше 65000 символов в юникоде.


Название: Re: фтп: сохранение не в файл
Отправлено: SABROG от Июль 09, 2010, 11:03
Файлы не сильно большие. Просто немного больше 65000 символов в юникоде.

130кб не влазит? Странно. Или ты в один QTextStream сразу несколько файлов записываешь?


Название: Re: фтп: сохранение не в файл
Отправлено: BRE от Июль 09, 2010, 11:10
130кб не влазит? Странно.
+1 Удивительно как-то.  :)

bladeser: Покажи как читаешь.


Название: Re: фтп: сохранение не в файл
Отправлено: SABROG от Июль 09, 2010, 12:51
Проверил в Убунту следующий код:

Код
C++ (Qt)
#include <QtCore/QString>
#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
 
enum {MAX = 1000000000};
 
int main(int /*argc*/, char** /*argv*/)
{
   QString* str = new QString;
 
   try {
       for (int i = 0; i < MAX; ++i)
           *str += QLatin1String("X");
   } catch(...) {
       qDebug() << str->size();
   }
   return 0;
}
 

После того как программа ловит исключение bad_alloc получаю количество символов в QString - 536870902.
Программа завершает своё выполнение, после того как откушает 1024Мб оперативы. То есть где-то 512Мб текста в Unicode'e QString спокойно держит. Думаю в ASCII в QByteArray можно и гигабайт текста запихнуть. То есть 130кб это какие-то явно не правильные цифры.