【问题标题】:Can Delphi JCL 7zCompression used to compress/decompress in-memory stream without file operations?Delphi JCL 7zCompression 可以用于在没有文件操作的情况下压缩/解压缩内存流吗?
【发布时间】:2011-10-23 06:58:06
【问题描述】:

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

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

任何人都可以提供一些说明或示例代码来说明如何实现这一点。非常感谢!

【问题讨论】:

  • 7z dll 包装器是否包含流功能或回调?
  • 有流入/流出以及一些回调对象。但是,我不知道如何以及是否可以在不使用那些高级成就对象的情况下直接使用它们。

标签: delphi 7zip jedi-code-library


【解决方案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;

【讨论】:

  • 完美!我测试了将 Gzip 更改为 7z,它就像一个魅力!非常感谢!
  • 您应该将 TRY/FINALLY 块中的前三行移到 TRY 之外。如果 .Create 构造函数中发生错误并引发异常,则 LArchive 未分配(并且不是 NIL),然后您尝试释放未分配的类实例。总是在释放的 TRY/FINALLY 块之前调用构造函数。另外 - 调用 FreeAndNIL 时不需要测试 Assigned(LArchive),因为该测试是在 FreeAndNIL 过程中执行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
相关资源
最近更新 更多