8

我之前使用过 TJcl7zCompressArchive / TJcl7zDecompressArchive 进行存档操作。

现在我想直接压缩/解压缩内存中的流而不进行文件操作。但是,当在网上搜索 JCL 演示中的示例时,我找不到使用该库的方法。我确实找到了其他工具来做到这一点,但压缩率似乎不如 7zip。

任何人都可以给出一些指示或示例代码来展示如何实现这一点。非常感谢!

4

1 回答 1

11

我使用 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;
于 2011-08-09T15:06:25.830 回答