8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Delphi] TZipFile の使い方

Last updated at Posted at 2022-10-22

TZipFile

TZipFileSystem.Zip ユニットに定義されている Zip アーカイブを操作するためのクラスです。

ですが!
具体的な使い方がどこにも書かれていないので、ここで簡単な圧縮と解凍方法ついて紹介します。

圧縮

単純なアーカイブ

書き込みモード (zmWrite) でファイルを Open して Add にファイル名を渡すだけです。

// uses に System.Zip を追加しておきます

var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmWrite);
  try
    Zip.Add('Foo.png');
    Zip.Add('Bar.txt');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;

モードによる違い

  • zwWrite
    ファイルを新規作成して上書きます。
    既存のアーカイブの内容は削除されます。

  • zwReadWrite
    既存のファイルを修正します。
    例えば Add を呼ぶと既存のアーカイブにファイルが追加されます。

ディレクトリ付きアーカイブ

ディレクトリを付けてアーカイブする場合は第2引数にファイル名を含んだ完全パスを指定します。

パスの区切りは必ず / を使います

パスの先頭に / を付けると TZipFile で解凍するときにルートディレクトリに解凍されてしまいます。絶対パス指定ではない場合は先頭に / を付けないように気をつけて下さい。

var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmWrite);
  try
    Zip.Add('Foo.png', 'Baz/Foo.png');
    Zip.Add('Bar.txt', 'Baz/Quux/Bar.txt');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;

解凍

全部解凍

読み込みモード (zmRead) でファイルを Open して、ExtractAll を使うと全てのファイルをディレクトリ付きで解凍します。
引数は解凍先のディレクトリです(存在しなければ自動的に生成されます)。

var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmRead);
  try
    Zip.ExtractAll('D:\Temp\test');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;

全部解凍2

ただ全部解凍するなら TZipFile.ExtractZipFile というクラスメソッドを使うほうが簡単です。
最後の引数は進捗用のイベントを渡します。

// 一番簡単な呼び出し(進捗用イベントはデフォルトで nil)
TZipFile.ExtractZipFile('D:\Temp\test.zip', 'D:\Temp\test');

// エンコーディングも指定可能
TZipFile.ExtractZipFile('D:\Temp\test.zip', 'D:\Temp\test', TEncoding.UTF8, nil);

1つ1つ解凍

1つ1つ解凍する場合は次のように Extract を使います。
第2引数は解凍先のディレクトリです。
第3引数に False を指定しない限りディレクトリは自動的に生成されます。

var Zip := TZipFile.Create;
try
  Zip.Open('D:\Temp\test.zip', TZipMode.zmRead);
  try
    for var i := 0 to Zip.FileCount - 1 do
      Zip.Extract(Zip.FileName[i], 'D:\Temp\test');
  finally
    Zip.Close;
  end;
finally
  Zip.Free;
end;

ちなみに FileInfo プロパティ または FileInfos プロパティ を使うとヘッダー情報が取得出来ます。
(ファイル名はヘッダー情報の1つです)

最後に

ExtractZipFile 以外は Open しないとどんな操作も受け付けないのですが、そういった事がどこにも書かれていなかったので記事にしました。
Zip を扱う際の一助になれば。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?