TZipFile
TZipFile は System.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 を扱う際の一助になれば。