使用Archive :: Zip存储文件时遇到问题:我得到没有错误代码的空zip文件

时间:2012-07-02 13:22:34

标签: perl zip archive

当我尝试通过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");
[..]

3 个答案:

答案 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/'