Delphi JCL 7zCompression可以在没有文件操作的情况下压缩/解压缩内存流吗?

Jus*_*ade 8 delphi 7zip jedi-code-library

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

现在我想直接压缩/解压缩内存流而无需文件操作.但是,当看到在网上搜索JCL演示的示例时,我找不到使用该lib的方法.我确实找到了其他工具,但压缩比似乎不如7zip.

任何人都可以提供一些指示或示例代码,说明如何实现这一目标 非常感谢!

小智 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;
Run Code Online (Sandbox Code Playgroud)

要解压缩流:

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;
Run Code Online (Sandbox Code Playgroud)

  • 您应该在TRY外部的TRY/FINALLY块中移动前三行.如果.Create构造函数中发生错误并引发异常,则LArchive将被取消分配(并且不是NIL),然后您尝试释放未分配的类实例.总是在释放的TRY/FINALLY块之前调用构造函数JUST.另外 - 在调用FreeAndNIL时,您不需要测试Assigned(LArchive),因为此测试是在FreeAndNIL过程中执行的. (4认同)