Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Упаковка на лету.   Найти похожие ветки 

 
puky   (2003-07-12 19:04) [0]

Как упаковать файл в памяти?
Пишу так:

    ZDest := NewMemoryStream;
    NewZLibCStream( Zipper, clMax, ZDest, nil );

    ofs.seek( 0, spBegin );
    Stream2Stream( Zipper, ofs, ofs.size );

    zipper.free;

    ofs.seek( 0, spBegin );
    ZDest.seek( 0, spBegin );
    Stream2Stream( ofs, ZDest, ofs.size );

    ZDest.free;

В результате пустой стрим.


 
puky   (2003-07-12 21:58) [1]

Может надо добавить в zlib.pas?

procedure PackStream(Var sSrc: PStream);
var
 UnknownPtr :pointer;
 NewSize    :integer;
begin
 sSrc.Position := 0;
 try
   CompressBuf( sSrc.Memory, sSrc.Size, UnknownPtr, NewSize );
   sSrc.size := 0;
   sSrc.Write( UnknownPtr^, NewSize );
   sSrc.Seek( 0, spBegin );
 finally
   FreeMem( UnknownPtr, NewSize );
 end;
end;

procedure UnPackStream(Var sSrc: PStream);
var
 UnknownPtr :pointer;
 NewSize    :integer;
begin
 sSrc.Seek( 0, spBegin );
 try
   DeCompressBuf( sSrc.Memory, sSrc.Size, 0, UnknownPtr, NewSize );
   sSrc.size := 0;
   sSrc.Seek( 0, spBegin );
   sSrc.Write( UnknownPtr^, NewSize );
   sSrc.Seek( 0, spBegin );
 finally
   FreeMem( UnknownPtr, NewSize );
 end;
end;


 
Vladimir Kladov   (2003-07-12 22:40) [2]

Это отрывок рабочего кода, здесь работа идет именно с потоками. По крайней мере, если на месте Mstrm здесь был бы поток, пополнящийся на ходу, то получилось бы как раз сжатие на лету.

function TfmMain.SaveCompressed(const Filename: String; SL: PStrList): Boolean;
var CStrm, FStrm, MStrm: PStream;
   Size: DWORD;
   C: Char;
begin
 FStrm := NewWriteFileStream( Filename );
 if FStrm.Handle = 0 then
 begin
   ShowMessage( "Can not write to file " + Filename );
   FStrm.Free;
   Result := FALSE;
   Exit;
 end;
 MStrm := NewMemoryStream;
 SL.SaveToStream( MStrm );
 Size := MStrm.Size;
 C := "*";
 FStrm.Write( C, 1 );
 FStrm.Write( Size, Sizeof( Size ) );
 CStrm := NewCompressionStream( clDefault, FStrm, nil );
 MStrm.Position := 0;
 Stream2Stream( CStrm, MStrm, Size );
 MStrm.Free;
 CStrm.Free;
 FStrm.Free;
 Result := TRUE;
end;


Для декомпрессии так же надо использовать NewDecompressionStream.



 
puky   (2003-07-13 09:40) [3]

У меня пример MemoryStream to WriteFileStream работает,
но если заменить WriteFileStream на MemoryStream - перестает работать. Как я понял, это связано с отсутствием метода записи.



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.032 c
1-1078927091
slair
2004-03-10 16:58
2004.03.28
Не ставится delpi6/builder6 под WindowsXP Pro Corp


14-1077891021
Cosinus
2004-02-27 17:10
2004.03.28
Подскажите, как сделать такой Edit . Замучался уже подбирать.


8-1068627723
claus
2003-11-12 12:02
2004.03.28
рисование линий на Canvas-e любой формы, задаваемые шаблоном


4-1073657446
txt
2004-01-09 17:10
2004.03.28
Не перерисовывается график! в Bitmap


1-1078407725
Geraldino
2004-03-04 16:42
2004.03.28
Работа с ресурсными файлами