Главная страница
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.022 c
1-1079016738
dimm22
2004-03-11 17:52
2004.03.28
Редактирование Hex файла. Как, чем, может исходники где есть.


3-1077718214
Молот
2004-02-25 17:10
2004.03.28
Как в QR вывести текст выравняный по обеим краям?


1-1078469102
Alex_DM
2004-03-05 09:45
2004.03.28
Вызов модального окна. Возможно ли это?


1-1078668907
able
2004-03-07 17:15
2004.03.28
Gutter


14-1077960542
Morfey
2004-02-28 12:29
2004.03.28
Как изменить анкету???