epubcheck 必須の META-INF/container.xml リソースが見つかりません.
perl で作成したEPUBファイルの正当性を epubcheck で検証したら下記のエラーが出力された。
FATAL(RSC-002): C:/works/20180504220137.epub/20180504220137.epub(-1,-1): 必須の META-INF/container.xml リソースが見つかりません.
ERROR(RSC-001): C:/works/20180504220137.epub/20180504220137.epub(-1,-1): ファイル 'META-INF/container.xml' が見つかりません.
エラーが検出されました
epubcheck 完了
実装は下記のとおり。
原因は、圧縮対象にファイルを追加する際、相対パスのデリミタにバックスラッシュ(\)を使用していたことにあった。
デリミタをスラッシュ(/)に置換したら無事エラーが解消したが、下記のような下手なプログラムを書くより addTree や addTreeMatching メソッドを使用した方が良いだろう。
use strict; use lib 'lib'; use utf8; use autodie; use Cwd qw(realpath); sub zip_pack { my ($directory, $output_file) = @_; use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); my $zip = Archive::Zip->new(); #絶対パスを取得 my $start_dir = realpath($directory); use File::Find; find( sub { my $filepath = $File::Find::name; if (! -f $filepath) { return; } #相対パスを取得 my $relative_path = File::Spec->abs2rel($filepath, $start_dir); #デリミタを \ から / に置換 $relative_path =~ s/\\/\//g; my $result = $zip->addFile($filepath, $relative_path); if ($relative_path eq 'mimetype') { $result->desiredCompressionMethod( COMPRESSION_STORED ); } }, $start_dir ); $zip->writeToFileNamed($output_file); }