Может ли Delphi JCL 7zCompression использовать для сжатия / распаковки потока в памяти без файловых операций? - PullRequest
8 голосов
/ 09 августа 2011

Раньше я использовал TJcl7zCompressArchive / TJcl7zDecompressArchive для выполнения операций архивирования.

Теперь я хотел бы сжимать / распаковывать потоки в памяти напрямую без файловой операции.Однако, когда я вижу примеры из демонстраций JCL, ищущих в Интернете, я не могу найти способ сделать это с помощью этой библиотеки.Я нашел другие инструменты для этого, но степень сжатия кажется не такой хорошей, как 7zip.

Может кто-нибудь дать некоторые указания или пример кода, показывающий, как этого добиться.Большое спасибо!

1 Ответ

11 голосов
/ 09 августа 2011

Я использую оболочку 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;
...