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

出了什么问题?

第一次更新:当我使用具有较短路径名的文件时,一切正常。任何解决方法的想法?符号链接不起作用。

第二次更新:这是一种解决方法:

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而不是比较字符串==

幸运的是(或不是,取决于您的观点)这两个错误以及您未能导入的值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 回答