Главная страница
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.02 c
14-1077853110
CrytoGen
2004-02-27 06:38
2004.03.28
библиотечные функции, которых нет в Delphi


1-1078393346
Aleksandr
2004-03-04 12:42
2004.03.28
Есть средства анализа объектов программы?


6-1074494112
Yura
2004-01-19 09:35
2004.03.28
Web-cервис (по статье на сайте)


1-1077848817
Dober_m@N
2004-02-27 05:26
2004.03.28
как динамически создать форму


6-1073621638
Hooch
2004-01-09 07:13
2004.03.28
Outlook Express