当我尝试通过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");
[..]
答案 0 :(得分:1)
将其更改为:$zip->addFile($plmxmlFile);
。
$zip
已经引用了您的目标文件,并且通过添加您用于输出的文件名,您正在尝试在组装尝试时从同一文件中读取和写入Archive::Zip
,创建一个一塌糊涂(而且通常不是你真正想要的)。
答案 1 :(得分:0)
我看不出为什么你的程序会创建一个空的zip文件,但你在几个地方滥用了引号。
特别是值AZ_OK
是可以按请求导入的数值的符号。
writeToFileNamed
方法永远不会返回字符串"AZ_OK"
,您也应该使用eq
而不是==
来比较字符串。
幸运(或不,取决于您的观点)这两个错误以及您导入AZ_OK
的值失败以及您遗漏use warnings
将比较{{1}的返回值使用零(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";
答案 2 :(得分:0)
也许我已经明白了问题所在:
您使用完整的根a/very/long/path/with/191/characters/file.txt
所以你压缩zip中的所有目录,你的文件是空的,因为你可以看到路径。
使用chdir
chdir 'a/very/long/path/with/191/characters/'