System.Zip を使ってみる

Rad Studio XE2が出ましたね。さっそくいろいろ触ってみたのですが、新たに追加されたZipサポートのSystem.Zipユニットヘルプが全くありません。
特にヘルプ無くても困らなそうですが、軽く触ってみたのでメモ。

使うにはusesにSystem.Zipを追加します。使用出来る圧縮方法は標準だと0(store)と8(deflate)のみ。その他の圧縮方法のサポートについては、クラスメソッドTZipFile.RegisterCompressionHandlerを使用して登録する必要があるようです。

使い方は、指定のファイルまたはフォルダをまとめて圧縮する場合は

  TZipFile.ZipDirectoryContents(圧縮ファイル名, 圧縮するパス, 圧縮方法(zcDeflate));

これだけです。実際のファイルパスと圧縮ファイル内のパスを変えるとかファイルを1個ずつ指定する場合は

var
  Zip: TZipFile;
begin
  Zip := TZipFile.Create;
  // 新規作成又は既存のファイルがあっても上書きする場合はOpenModeにzmWriteを指定
  // 既存のファイルにファイルを追加する場合はOpenModeにzmReadWriteを指定する。
  Zip.Open('TEST.ZIP', zmWrite);

  //  Zip.Add(圧縮するファイルパス, 圧縮ファイル内のパス, 圧縮方法) を指定
  //  Zip.Addには他に圧縮するデータをTStreamやTBytesで渡すメソッドも定義されています。
  Zip.Add('Unit1.dcu', 'TEST\Unit1.dcu');
  Zip.Add('Unit1.dcu', 'TEST2\Unit1.dcu');
  Zip.Close;

  FreeAndNil(Zip);
end;

展開する場合は、圧縮ファイル内のファイルを全部展開する場合

  TZipFile.ExtractZipFile(圧縮ファイル名, 展開するパス);

で展開できます。圧縮ファイル内のファイルを選んで展開する場合は以下のような感じで展開できます。

var
  Zip: TZipFile;
begin
  Zip := TZipFile.Create;
  Zip.Open('TEST.ZIP', zmRead);

  // Extractメソッドでファイルを指定して展開できます。
  // Extract(インデックス 又は 圧縮ファイル内でのファイル名, 展開先のパス, フォルダを作成するかどうか)
  Zip.Extract(0);
  Zip.Close;

  FreeAndNil(Zip);
end;