2012-01-17 20 views
7

このような機能を持つzipコンポーネントはありますか?インターネットからストリームにzipアーカイブをダウンロードし、ストリームからアーカイブを開いて、別のストリームにファイルを展開する必要があります。Delphi:ストリームからzipアーカイブを開く - >ストリームに抽出する

など。 ZipForgeは、ストリームからアーカイブを開くことができますZipForge.OpenArchive(MyStream, false); ...別のものに抽出する方法...?

procedure ExtractToStream(FileName: WideString; Stream: TStream); 

TFileStream、TMemoryStream 又はTBlobStream等TStreamに子孫オブジェクトに アーカイブ内のファイルに格納されたデータを解凍するための説明

使用ExtractToStream。

FileNameパラメータは、抽出されるファイル名を指定します。

そしてOpenArchive(MyStream, false)方法のどのような使用抽出がサポートされていない場合...

答えて

19

XE2に内蔵されているzipファイルのコンポーネントは、これを行います。

入力パラメータとしてTStreamを受け取るオーバーロードされたOpenメソッドがあります。

個別のファイルを抽出するには、抽出するファイルの名前を渡してオーバーロードされたReadメソッドを呼び出すことができます。抽出されたファイルは、TStreamの新しいインスタンスとして返されます。そのインスタンスでCopyFromを使用すると、抽出したファイルをストリームに転送できます。私はこのコードをテストしていませんでした

var 
    ZipFile: TZipFile; 
    DownloadedStream, DecompressionStream, MyStream: TStream; 
    LocalHeader: TZipHeader; 
... 
ZipFile := TZipFile.Create; 
try 
    ZipFile.Open(DownloadedStream, zmRead); 
    ZipFile.Read('myzippedfile', DecompressionStream, LocalHeader); 
    try 
    MyStream.CopyFrom(DecompressionStream, DecompressionStream.Size); 
    finally 
    DecompressionStream.Free; 
    end; 
finally 
    ZipFile.Free; 
end; 

注、私はちょうどそれがTZipFileのソースコードとそのソースコードに含まれる文書に基づいて書かれてきました。これにはいくつかのシワがあるかもしれませんが、コードが宣伝されているように振る舞うと、あなたのニーズを完全に満たします。


私は好奇心が強いので、今、私はそれをテストしました。それは私にとってより便利だったので、私は、インデックスではなく、ファイル名が抽出した

program ZipTest; 

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils, 
    System.Classes, 
    System.Zip; 

procedure ExtractToFile(
    const ZipFileName: string; 
    const ZippedFileIndex: Integer; 
    const ExtractedFileName: string 
); 
var 
    ZipFile: TZipFile; 
    DownloadedStream, DecompressionStream, OutputStream: TStream; 
    LocalHeader: TZipHeader; 
begin 
    DownloadedStream := TFileStream.Create(ZipFileName, fmOpenRead); 
    try 
    ZipFile := TZipFile.Create; 
    try 
     ZipFile.Open(DownloadedStream, zmRead); 
     ZipFile.Read(ZippedFileIndex, DecompressionStream, LocalHeader); 
     try 
     OutputStream := TFileStream.Create(ExtractedFileName, fmCreate); 
     try 
      OutputStream.CopyFrom(DecompressionStream, DecompressionStream.Size); 
     finally 
      OutputStream.Free; 
     end; 
     finally 
     DecompressionStream.Free; 
     end; 
    finally 
     ZipFile.Free; 
    end; 
    finally 
    DownloadedStream.Free; 
    end; 
end; 

begin 
    try 
    ExtractToFile('C:\desktop\test.zip', 0, 'C:\desktop\out.txt'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

注:ここでは、このすべての作品を宣伝することを示しているプログラムです。そして私はあなたが使用すると想像するメモリストリームではなくファイルストリームを使用しました。しかし、TZipFileのメソッドはTStreamで動作するので、このコードはどんな形式のストリームでも動作すると確信しています。


これはZIPファイルに関する一連の最新の情報です。私はあなたがXE2を使用していることを知っています。なぜXE2が提供するZIPクラスを使用するのが嫌なのだろうと思います。私はそれがあなたの要件を満たしていないことを示す何も見ていない。実際にはストリームと直接連携することができるため、あらゆるアプリケーションに十分な汎用性を持っていると感じられます。

+1

ありがとうDavid! – maxfax

+0

Readメソッドが表示されませんでした(私は速くチェックしました)、それに関する純粋な情報があります。http://docwiki.embarcadero.com/VCL/en/System.Zip.TZipFile – maxfax

+0

@maxfaxを読むあなたはDelphiのどのエディションをお持ちですか?私はプロを持っているし、それはソースが付属しています。最近の両方のZIP質問への私の答えは、完全にソースを読むことに基づいています。私はZIPファイルについては何も知らず、このコンポーネントについては何も知らない。あなたがソースコードを持っていれば、それはあなたに大きな助けになると思います。 –

関連する問題