Форум: "KOL";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизУпаковка на лету. Найти похожие ветки
← →
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 вся ветка
Форум: "KOL";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.034 c