Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2010, 12:53   #1
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию TMemoryStream и Zlib

Вопрос вот в чем, мне нужно файл сжать с помощью Zlib и запихнуть в TMemoryStream. Толи переработался, толи еще что, но не могу сообразить как.
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 28.05.2010, 13:06   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте взять ZLib от Indy.
там удобная реализация на основе потоков(промежуточный поток)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2010, 13:30   #3
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

Код:
var
  buffer_size: integer = 1024;
  dest: TMemoryStream;
  source: TFileStream;
  ComStream: TCompressionStream;
  BytesRead: integer;
  MainBuff: array[0..1023] of char;

.......
 
       source := TFileStream.Create('C:\123.dat', fmOpenReadWrite);
        try
          dest := TMemoryStream.Create;
          ComStream := TCompressionStream.Create(clMax, dest);
           repeat
             bytesread := source.Read(mainbuff, buffer_size);
             ComStream.Write(mainbuff, bytesread);
           until bytesread < 1024;
        except
          ComStream.Free;
          dest.Free;
          Source.Free;
          exit;
        end;
        ComStream.Free;
        Source.Free;
        dest.Free;
      end;
вот так не получается
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 28.05.2010, 13:38   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
source := TFileStream.Create('C:\123.dat', fmOpenReadWrite);
dest := TMemoryStream.Create;
ComStream := TCompressionStream.Create(clMax, dest);
ComStream.CopyFrom(Source,Source.Size);
ComStream.Free;
source.Free;
если не получится, то уточняйте, что именно не получается.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2010, 13:44   #5
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

код работает без ошибок, но мне еще нужно получить размер новых скомпрессированных данных и сравнить с исходным размером данных файла (C:\123.dat) - условно сравнить (дабы увидеть результат компрессии).
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 28.05.2010, 13:54   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
source := TFileStream.Create('C:\123.dat', fmOpenReadWrite);
dest := TMemoryStream.Create;
ComStream := TCompressionStream.Create(clMax, dest);
ComStream.CopyFrom(Source,Source.Size);
ComStream.Free;
ShowMessage('Исходный размер: '+IntToStr(Source.Size)+#10#13'Итоговый размер: '+IntToStr(Dest.Size)+#10#13'Сжато на '+IntToStr(Source.Size-Dest.Size)+' байт.');
dest.free;
source.Free;
тоже мне проблема
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2010, 14:02   #7
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

в том то и дело, что Dest.size я уже давно пробовал у меня оно всегда равно 0 (ноль). Уже и ComStream.Size пробовал, все равно облом.
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 28.05.2010, 14:50   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте Dest.Position(сразу после сжатия)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2010, 15:24   #9
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

после создания потока dest := TMemoryStream.Create;
Dest.Position = 0; и после сжатия тоже, ему же память выделяется я так понимаю при создании???
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 28.05.2010, 15:34   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TMemoryStream.Size показывает размер данных записанных в него.
Цитата:
ему же память выделяется я так понимаю при создании???
памяти для данных динамически по сути.
Цитата:
Dest.Position = 0; и после сжатия тоже
может вы делаете что то не то?
я только что проверил, все работает.(Size и Position)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TMemoryStream Владимир1988 Помощь студентам 0 13.02.2010 13:04
Алгоритм сжатия+ zlib Воин-Леший Общие вопросы Delphi 1 09.12.2007 15:05
Zlib.dll RoadTrain Общие вопросы Delphi 3 08.05.2007 13:41
ZLib Simply-Art Обсуждение статей 3 03.03.2007 08:24