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

Posted

技术标签:

【中文标题】使用 Archive::Zip 存储文件时遇到问题:我得到没有错误代码的空 zip 文件【英文标题】:Trouble storing files with Archive::Zip: I get empty zip files without error code 【发布时间】:2012-07-02 13:22:34 【问题描述】:

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

【问题讨论】:

【参考方案1】:

将其更改为:$zip->addFile($plmxmlFile);

$zip 已经引用了您的目标文件,并且通过添加您将用于输出的文件的名称,您正在使Archive::Zip 尝试在组装尝试时从同一个文件读取和写入,从而造成混乱(并且只是通常不会做你真正想要的)。

【讨论】:

不起作用。我编辑了这个错误以避免进一步混淆。 为我工作。你确定你没有丢失文件路径中以/ 开头的根文件夹吗?【参考方案2】:

我不明白为什么您的程序会创建一个空的 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";

【讨论】:

@d135-1r43:我稍微修改了代码。请在我的回答中尝试修改后的版本。 与以前的行为相同。不显示错误消息(最后一行代码)。 @d135-1r43:那么我很抱歉——这里不是教你如何调试的地方。自己尝试一些事情,如果您遇到困难,我们会提供帮助 感谢您的努力。我会尝试从 Archive/Zip.pm 中获取一些调试信息。【参考方案3】:

也许我已经理解了问题所在: 你使用完整的根a/very/long/path/with/191/characters/file.txt

所以你压缩了 zip 中的所有目录,你的文件是空的,因为你可以看到路径。 使用 chdir chdir 'a/very/long/path/with/191/characters/'

【讨论】:

以上是关于使用 Archive::Zip 存储文件时遇到问题:我得到没有错误代码的空 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 perl Archive::Zip 创建 *.epub -- epubchecker 错误

Perl Archive::zip -- 文件没有被添加

Golang 创建受密码保护的 zip 文件

Archive::Zip 无法在 Perl 中创建 Zip 对象

Perl Archive::Zip 创建不必要的文件夹

可用空间有限时如何归档大文件夹