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クラスを使用するのが嫌なのだろうと思います。私はそれがあなたの要件を満たしていないことを示す何も見ていない。実際にはストリームと直接連携することができるため、あらゆるアプリケーションに十分な汎用性を持っていると感じられます。
ありがとうDavid! – maxfax
Readメソッドが表示されませんでした(私は速くチェックしました)、それに関する純粋な情報があります。http://docwiki.embarcadero.com/VCL/en/System.Zip.TZipFile – maxfax
@maxfaxを読むあなたはDelphiのどのエディションをお持ちですか?私はプロを持っているし、それはソースが付属しています。最近の両方のZIP質問への私の答えは、完全にソースを読むことに基づいています。私はZIPファイルについては何も知らず、このコンポーネントについては何も知らない。あなたがソースコードを持っていれば、それはあなたに大きな助けになると思います。 –