0

Archive::Zip を使用して zip アーカイブを作成しようとすると、エラーはスローされませんが、結果の zip ファイルは壊れています。

use Archive::Zip;

my $zip = Archive::Zip->new();
my $file = "/a/very/long/path/with/191/characters/file.txt";

if(-f $file)
{
  $zip->addFile("$file", "destinationname.txt");
  print "$file added\n";
}
unless ($zip->writeToFileNamed("out.zip") == "AZ_OK") { die "error";};

今、私の out.zip ファイルはちょうど 22B で、空です:

$> > unzip -l out.zip
Archive:  out.zip
warning [out.zip]:  zipfile is empty

何がうまくいかないのですか?

最初の更新: パス名が短いファイルを使用すると、すべて正常に動作します。回避策はありますか?シンボリックリンクは機能しません。

2 番目の更新: これは回避策として機能します。

use File::Slurp;
[...]
my $text = read_file($file);
$zip->addString($text, "destinationfile.txt");
[..]
4

3 に答える 3

1

次のように変更します$zip->addFile($plmxmlFile);

$zipはすでにターゲットファイルへの参照であり、出力に使用するファイルの名前を追加することでArchive::Zip、アセンブルの試みで同じファイルから読み書きを試み、混乱を引き起こしています(そして、一般的に、本当に望んでいたことをしていません)。

于 2012-07-02T13:26:15.120 に答える
0

多分私は問題が何であるかを理解しました:あなたは完全なルートを使用しますa/very/long/path/with/191/characters/file.txt

zip 内のすべてのディレクトリを圧縮すると、ファイルは空になります。これは、パスを確認できることに注意してください。chdirを使用する chdir 'a/very/long/path/with/191/characters/'

于 2013-09-25T08:18:52.460 に答える
0

プログラムが空の zip ファイルを作成する理由はわかりませんが、いくつかの場所で引用符を誤用しています。

特に、値AZ_OKは、要求によってインポートできる数値の記号です。

このwriteToFileNamedメソッドは文字列を返すことはありません。また、代わりに を"AZ_OK"使用して文字列を比較する必要があります。eq==

幸いなことに (または、あなたの観点に応じて)、これら 2 つのエラーと の値のインポートの失敗AZ_OKと の省略によりuse warnings、 の戻り値がwriteToFileNamedゼロ (の適切な値AZ_OK) と比較され、正しい結果が得られるはずです。

代わりにこのプログラムを試してください。

use strict;
use warnings;

use Archive::Zip qw( :ERROR_CODES );

my $zip = Archive::Zip->new;
my $file = 'a/very/long/path/with/191/characters/file.txt';

if (-f $file) {
  $zip->addFile($file, 'destinationname.txt');
  print "$file added\n";
}

my $status = $zip->writeToFileNamed('out.zip');
$status == AZ_OK or die "error $status";

アップデート

数百文字の長さでない限り、パスの長さによる違いはほとんどありません。

このバージョンを試してみて、何が得られるか教えてください。

use strict;
use warnings;

use Archive::Zip qw( :ERROR_CODES );

my $zip = Archive::Zip->new;
my $file = 'a/very/long/path/with/191/characters/file.txt';

unlink 'out.zip';

die qq(File "$file" not found) unless -f $file;
$zip->addFile($file, 'destinationname.txt');
print "$file added\n";

my $status = $zip->writeToFileNamed('out.zip');
$status == AZ_OK or die "error $status";
于 2012-07-02T15:30:34.840 に答える