C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: как добавит в TMemoryStream данные файла  (Прочитано 2421 раз)
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


как добавит в TMemoryStream данные файла
« : 09 Декабрь 2015, 17:46:51 »

Интересует такое, если использовать MemoryStream ->LoadFromFile("c:\\mix.jpg");,
то как я понял из хелпа "Thus, LoadFromFile will discard any pre-existing data stored in the memory stream. "
Тоесть, будут затираться данные, которые уже есть в потоке.

Как можно добавлять несколько файлов в MemoryStream, чтобы потом с ними возможно  было работать???
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: как добавит в TMemoryStream данные файла
« Ответ #1 : 10 Декабрь 2015, 09:21:28 »

В итоге получишь единый "брусок" из данных вместо неск файлов - тебе оно надо?
Если все таки надо делай так:
Код:
// FileStream - поток для загрузки файлов поштучно
// DataStream - поток для хранения данных всех загруженных файлов
DataStream->Clear();
FileStream->LoadFromFile("file01.jpg"); FileStream->SaveToStream(DataStream);
FileStream->LoadFromFile("file02.jpg"); FileStream->SaveToStream(DataStream);
FileStream->LoadFromFile("file03.jpg"); FileStream->SaveToStream(DataStream);
FileStream->LoadFromFile("file04.jpg"); FileStream->SaveToStream(DataStream);
// ...
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: как добавит в TMemoryStream данные файла
« Ответ #2 : 10 Декабрь 2015, 16:56:42 »

Спасибо за подсказку.
Блоки однородных данных будут в разделены символами-разделителями. Во всяком случае такая задумка...
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: как добавит в TMemoryStream данные файла
« Ответ #3 : 10 Декабрь 2015, 19:50:43 »

Цитата: direk от 10 Декабрь 2015, 16:56:42
Блоки однородных данных будут в разделены символами-разделителями.

Оно текстовое что-ли? Так зачем поток?
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: как добавит в TMemoryStream данные файла
« Ответ #4 : 10 Декабрь 2015, 20:04:41 »

Цитата: POV от 10 Декабрь 2015, 19:50:43
Цитата: direk от 10 Декабрь 2015, 16:56:42
Блоки однородных данных будут в разделены символами-разделителями.

Оно текстовое что-ли? Так зачем поток?

Нет, файлы -  это картинки. Разделитель - набор уникальной (надеюсь )) )  последовательности символов, с помощью которой впоследствии набор данных можно будет разделить на составляющее.

Это для решения вопроса, который я задавал здесь - https://cbuilder.ru/index.php/topic,9610.0.html В принципе сейчас тестирую - кажись работает...
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: как добавит в TMemoryStream данные файла
« Ответ #5 : 29 Декабрь 2015, 12:03:26 »

Хочется надеяться что вы не работаете на ядерной станции с таким подходом...
Почему не писать в поток набор пар [размер потока 1][данные потока 1][размер потока 2][данные потока 2] ... ?
Результат гарантированно точно делится на составляющие безо всяких "волшебных" последовательностей.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как добавит в TMemoryStream данные файла
« Ответ #6 : 30 Декабрь 2015, 17:37:45 »

Цитата: Hex от 29 Декабрь 2015, 12:03:26
Хочется надеяться что вы не работаете на ядерной станции с таким подходом...
Почему не писать в поток набор пар [размер потока 1][данные потока 1][размер потока 2][данные потока 2] ... ?
Результат гарантированно точно делится на составляющие безо всяких "волшебных" последовательностей.

Наверное, лучше все-таки размеры хранить отдельно, напр. в векторе. Тогда данные в потоке могут быть без разделителей, т.к. куски читаются по заданным размерам.
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: как добавит в TMemoryStream данные файла
« Ответ #7 : 31 Декабрь 2015, 12:38:51 »

если все лежит локально - да, но ТС все это куда то дальше пропихивает, а слать лучше 1 объект а не десяток.
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


« Ответ #8 : 31 Декабрь 2015, 19:10:49 »

наверное каждый вариант имеет право на существование...
Конкретно у меня работает (уже )так - с интернетсайта в память загружаються картинки (без предвратительного сохраниния на диск), потом через поток сохраняю все в один файл:
Код
 
TMemoryStream *Stream_Image = new TMemoryStream;
if (RzFlowPanel1->ControlCount > 0)
  {
for (i = 0; i RzFlowPanel1->ControlCount; i++)
{
dovidnyk_all = "";
TImage *image5 = (TImage *) RzFlowPanel1->Components[i];
image5->Picture->Graphic->SaveToStream(Stream_Image) ;
dovidnyk_all = dovidnyk_all + + "|PROBEL|";
dovidnyk_all = dovidnyk_all + RzEdit3->Text +"_" + IntToStr(i)+".jpeg" + "|PROBEL|";
dovidnyk_all = dovidnyk_all + image5->Picture->Width + "|PROBEL|";
dovidnyk_all = dovidnyk_all + image5->Picture->Height + "|STROKAEND|";
char *char_dovidnyk_all = dovidnyk_all.c_str();
Stream_Image->Write(char_dovidnyk_all, dovidnyk_all.Length() );
}
Stream_Image->Position = 0;
Stream_Image->SaveToFile("c:\\test.txt");

после загружаю в SQL в табличную переменную и обрабатываю, как мне нужно (ссылка на тему есть выше):

Код
DECLARE @T_list_image TABLE ( name nvarchar(255), width_ INT , height_ INT, file_stream_ varbinary(MAX))
 
INSERT INTO  @T_list_image   SELECT name, width_ , height_ , file_stream_ FROM  OPENROWSET(BULK  'c:\test.txt', FORMATFILE='c:\values.fmt' ) AS t1;
 

Сперва хотел передавать через параметр sql-запроса, но там нужно было все усложнять. А так проще получилось...

Вот такая извращенная у меня фантазия )))))

Р.С. Конечно, это упрощенный вариант как пример реализации,  а в реальной моей программе все сложнее
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.11 секунд. Запросов: 21.