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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: фтп: сохранение не в файл  (Прочитано 5457 раз)
bladeser
Гость
« : Июль 07, 2010, 08:50 »

Извините за тупой вопрос но как организовать закачку текстового файла с фтп не в файл а например в QString?
Пока не придумал ничего лучше как ftp->QBuffer -> QString. Может есть путь короче?
Записан
eugene
Гость
« Ответ #1 : Июль 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()
Записан
SABROG
Гость
« Ответ #2 : Июль 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.
Записан
bladeser
Гость
« Ответ #3 : Июль 07, 2010, 09:48 »

А разве можно вместо QIODevice передавать QTextStream? Попробую. Подскажите еще чем лучше пользоваться QFtp или QNetworkAccessManager? Я прочитал что QFtp и QHttp остались в qt4 только ради совместимости.
Записан
SABROG
Гость
« Ответ #4 : Июль 07, 2010, 14:54 »

Подскажите еще чем лучше пользоваться QFtp или QNetworkAccessManager? Я прочитал что QFtp и QHttp остались в qt4 только ради совместимости.

Про QFtp нигде не сказано, что он Deprecated, хотя думаю это вопрос времени. Где-то видел, что с помощью QNetworkAccessManager нельзя реализовать докачку контента после обрыва связи, а с классом QFtp вроде можно. Поэтому если хочется идти в ногу со временем и пока не планируется реализовывать докачку файлов, то лучше использовать QNetworkAccessManager, тем более, что потом не придется делать рефакторинг кода.
Записан
bladeser
Гость
« Ответ #5 : Июль 09, 2010, 07:59 »

Нарисовал через QNetworkAccessManager. И появился новый вопрос. Некоторые файлы не помещаются в QString. Что посоветуете в темп файл писать, а потом читать или лучше в массив?
Записан
BRE
Гость
« Ответ #6 : Июль 09, 2010, 08:04 »

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

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

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

а потом работай как с массивом "uchar *".
Записан
bladeser
Гость
« Ответ #8 : Июль 09, 2010, 08:20 »

Файлы не сильно большие. Просто немного больше 65000 символов в юникоде.
Записан
SABROG
Гость
« Ответ #9 : Июль 09, 2010, 11:03 »

Файлы не сильно большие. Просто немного больше 65000 символов в юникоде.

130кб не влазит? Странно. Или ты в один QTextStream сразу несколько файлов записываешь?
Записан
BRE
Гость
« Ответ #10 : Июль 09, 2010, 11:10 »

130кб не влазит? Странно.
+1 Удивительно как-то.  Улыбающийся

bladeser: Покажи как читаешь.
Записан
SABROG
Гость
« Ответ #11 : Июль 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кб это какие-то явно не правильные цифры.
« Последнее редактирование: Июль 09, 2010, 12:53 от SABROG » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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