使用 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 错误