Может ли Delphi JCL 7zCompression использовать для сжатия / распаковки потока в памяти без файловых операций?
Я использовал TJcl7zCompressArchive / TJcl7zDecompressArchive для выполнения операции архивирования ранее.
Теперь я хотел бы сжать / распаковать потоки в памяти напрямую без файловой операции. Однако, когда я вижу примеры из демонстраций JCL, ищущих в Интернете, я не могу найти способ сделать это с помощью этой библиотеки. Я нашел другие инструменты для этого, но степень сжатия кажется не такой хорошей, как 7zip.
Может кто-нибудь дать несколько указаний или пример кода, показывающего, как этого добиться. Большое спасибо!
1 ответ
Решение
Я использую оболочку JCL для сжатия потока GZIP - не уверен, что он будет работать просто с использованием TJcl7ziCompresspArchive. Для сжатия потока я использую следующее:
procedure _CompressStreamGZIP( const ASourceStream, ADestinationStream: TStream );
var
LArchive : TJclCompressArchive;
begin
ADestinationStream.Position := 0;
ASourceStream.Position := 0;
LArchive := TJclGZipCompressArchive.Create( ADestinationStream, 0, False );
try
LArchive.AddFile( '..\Stream.0', ASourceStream, false );
LArchive.Compress();
finally
if ( Assigned( LArchive ) ) then FreeAndNil( LArchive );
end;
end;
Чтобы распаковать поток:
procedure _DecompressStreamGZIP( const ASourceStream, ADestinationStream : TStream );
var
LArchive : TJclDecompressArchive;
begin
ADestinationStream.Position := 0;
ASourceStream.Position := 0;
LArchive := TJclGZipDecompressArchive.Create( ASourceStream, 0, false );
try
LArchive.ListFiles();
LArchive.Items[0].Stream := ADestinationStream;
LArchive.Items[0].OwnsStream := false;
LArchive.Items[0].Selected := True;
LArchive.ExtractSelected();
finally
if ( Assigned( LArchive ) ) then FreeAndNil( LArchive );
end;
end;