Russian Qt Forum
Февраль 10, 2012, 15:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

Извините за тупой вопрос но как организовать закачку текстового файла с фтп не в файл а например в QString?
Пока не придумал ничего лучше как ftp->QBuffer -> QString. Может есть путь короче?
Записан
eugene
Новичок

Offline Offline

Сообщений: 44


« Ответ #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
Гуру общения
******
Offline Offline

Сообщений: 1424



« Ответ #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.
Записан

Национальная группа Russian Federation на QtCentre.
Qt: 4.7.2, GCC: 4.4.0
We'd get - widget!
bladeser
Гость
« Ответ #3 : Июль 07, 2010, 09:48 »

А разве можно вместо QIODevice передавать QTextStream? Попробую. Подскажите еще чем лучше пользоваться QFtp или QNetworkAccessManager? Я прочитал что QFtp и QHttp остались в qt4 только ради совместимости.
Записан
SABROG
Гуру общения
******
Offline Offline

Сообщений: 1424



« Ответ #4 : Июль 07, 2010, 14:54 »

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

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

Национальная группа Russian Federation на QtCentre.
Qt: 4.7.2, GCC: 4.4.0
We'd get - widget!
bladeser
Гость
« Ответ #5 : Июль 09, 2010, 07:59 »

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

Сообщений: 3055



« Ответ #6 : Июль 09, 2010, 08:04 »

Нарисовал через QNetworkAccessManager. И появился новый вопрос. Некоторые файлы не помещаются в QString. Что посоветуете в темп файл писать, а потом читать или лучше в массив?
А если файлы будут по 100Гб...
IMHO, полученный кусок сразу писать в файл и забывать о нем, не нужно память занимать.
Записан
SABROG
Гуру общения
******
Offline Offline

Сообщений: 1424



« Ответ #7 : Июль 09, 2010, 08:08 »

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

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

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

Национальная группа Russian Federation на QtCentre.
Qt: 4.7.2, GCC: 4.4.0
We'd get - widget!
bladeser
Гость
« Ответ #8 : Июль 09, 2010, 08:20 »

Файлы не сильно большие. Просто немного больше 65000 символов в юникоде.
Записан
SABROG
Гуру общения
******
Offline Offline

Сообщений: 1424



« Ответ #9 : Июль 09, 2010, 11:03 »

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

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

Национальная группа Russian Federation на QtCentre.
Qt: 4.7.2, GCC: 4.4.0
We'd get - widget!
BRE
Джедай : наставник для всех
*******
Online Online

Сообщений: 3055



« Ответ #10 : Июль 09, 2010, 11:10 »

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

bladeser: Покажи как читаешь.
Записан
SABROG
Гуру общения
******
Offline Offline

Сообщений: 1424



« Ответ #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 » Записан

Национальная группа Russian Federation на QtCentre.
Qt: 4.7.2, GCC: 4.4.0
We'd get - widget!
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

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