PerlでZipファイルを作る

Movable Type用に今後作りたいと考えているプラグインで、Zipファイルを作成する処理が必要になります。
そこで、PerlでZipファイルを作る方法を調べてみました。

Archive::Zip

PerlでZipファイルを操作するには、Archive::Zipを使うのが簡単です。
Archive::ZipはZipファイルの作成や読み込みの機能を持ったクラスで、シンプルな記法でZipファイルを読み書きすることができます。

Perlのプログラムに以下の行を入れると、Archive::Zipを使うことができます。

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

Zipファイルのオブジェクトを作成

Archive::ZipでZipファイルを作る場合、まずメモリ上にZipファイルのオブジェクトを作ります。
オブジェクトを変数$zipに割り当てるなら、以下のように書きます。

my $zip = Archive::Zip->new();

ファイルを圧縮する

ファイルを圧縮するには、オブジェクトのaddFileメソッドを使います。
オブジェクトを変数$zipに割り当てている場合に、カレントディレクトリにある「sample1.txt」ファイルを圧縮するには、以下のように書きます。

$zip->addFile('sample1.txt');

サブディレクトリにあるファイルを圧縮するには、サブディレクトリ名も含めてファイル名を指定します。
例えば、カレントディレクトリの中に「dir」というディレクトリがあり、その中の「sample2.txt」ファイルを圧縮するには、以下のように書きます。

$zip->addFile('dir/sample2.txt');

また、ファイル名を変えて圧縮したい場合は、addFileメソッドの2つ目のパラメータでそのファイル名を指定します。
例えば、「sample1.txt」を圧縮し、ファイル名を「otherfile.txt」にしたい場合は、以下のように書きます。

$zip->addFile('sample1.txt', 'otherfile.txt');

テキストデータを圧縮する

テキストデータを直接に圧縮することもできます。
それには、「addString」というメソッドを使います。

例えば、変数$strに入っているテキストデータを圧縮し、「string.txt」というファイル名を付けたい場合は、以下のように書きます。

$zip->addString($str, 'string.txt');

圧縮せずに格納する

Zipファイルにファイルや文字列を追加する際に、圧縮せずに単に格納だけしたい場合もあります(例:短いファイルで、圧縮するとかえってサイズが大きくなる場合)。
このような時には、addFileやaddStringのメソッドを実行した後に、その戻り値のオブジェクトに対して「desiredCompressionMethod」というメソッドを実行し、パラメータとして「COMPRESSION_STORED」を渡します。

例えば、「sample1.txt」というファイルを格納するだけの場合、以下のように書きます。

my $sample1 = $zip->addFile('sample1.txt');
$sample1->desiredCompressionMethod(COMPRESSION_STORED);

Zipファイルに保存する

Zipファイルのオブジェクトを作り終わったら、最後にその内容をZipファイルに保存します。
それには「writeToFileNamed」というメソッドを使い、パラメータとしてファイル名を指定します。
戻り値が「AZ_OK」なら、保存に成功しています。

例えば、変数$zipに割り当てたオブジェクトを「sample.zip」というファイルに保存するには、以下のようにします。

if ($zip->writeToFileNamed('sample.zip') == AZ_OK) {
    print "sample.zip is successfully saved.\n";
}
else {
    print "sample.zip save error.\n";
}