8

以前、 TJcl7zCompressArchive / TJcl7zDecompressArchive を使用してアーカイブ操作を行っていました。

今、ファイル操作なしでメモリ内ストリームを直接圧縮/解凍したいと思います。ただし、Web で検索している 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 に答える