2011-08-09 1 views
7

TJcl7zCompressArchive/TJcl7zDecompressArchiveを使用して以前にアーカイブ操作を行っていました。Delphi JCL 7zCompressionは、ファイル操作なしでメモリ内ストリームを圧縮/解凍するために使用できますか?

今、ファイル操作なしで直接メモリ内ストリームを圧縮/解凍したいと思います。しかし、WebでのJCLデモの検索の例を見ると、そのlibを使用する方法を見つけることができません。私はそれを行うための他のツールを見つけましたが、圧縮率は7zipほど良くないようです。

これを実現する方法やサンプルコードは、誰でも教えてください。どうもありがとう!

+0

は何とかストリーム機能やコールバックを7zのDLLラッパー含まれています:

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; 

は、ストリームを解凍するには、次の私が使用してストリームを圧縮するには? –

+0

instream/outstreamといくつかのコールバックオブジェクトがあります。しかし、どのように高レベルのAchieveオブジェクトを使用せずにそれらを直接使用することができるのか分かりません。 – Justmade

答えて

10

私はJCLラッパーを使ってGZIPストリームを圧縮します.TJcl7ziCompresspArchiveを使用するだけで動作するかどうかはわかりません。

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; 
+0

パーフェクト!私はGzipを7zに変更してテストしました。それは魅力のように機能します!どうもありがとうございました! – Justmade

+3

TRY外のTRY/FINALLYブロックの最初の3行を移動する必要があります。 .Createコンストラクタでエラーが発生し、例外が発生した場合、LArchiveは割り当てられていない(NILではありません)ので、未割り当てのクラスインスタンスを解放しようとします。解放されるTRY/FINALLYブロックの前に、必ずコンストラクタJUSTへの呼び出しを配置し​​ます。また、このテストはFreeAndNILプロシージャ内で実行されるため、FreeAndNILを呼び出すときにAssigned(LArchive)をテストする必要はありません。 – HeartWare

関連する問題