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

Posted

技术标签:

【中文标题】Perl Archive::zip -- 文件没有被添加【英文标题】:Perl Archive::zip -- file doesn't get added 【发布时间】:2011-05-03 20:41:55 【问题描述】:

我正在遍历目录树(颠覆备份)并将找到的每个文件和目录添加到 zip 文件中。这很有效。但是缺少两个文件。

sub zipFolder

    my $dir = 'D:\\SVN-Backup\\EnterpriseDataRepository\\20110502-0630';
    my $zip = Archive::Zip->new();
    my $zipped = $zip->addDirectory($dir);
    $zipped->desiredCompressionLevel( 9 );
    $zipped->desiredCompressionMethod( COMPRESSION_DEFLATED );
        print "Before find\n";
    find(\&zip_file, $dir);
    print "after find\n";
    die 'write error' unless $zip->writeToFileNamed('D:/SVN-Backup/CCBuild/backup.zip' ) == AZ_OK;

    sub zip_file 
    
          print $File::Find::name;
          if ( -d $File::Find::name )  # just grab directories, not files.
            $zip->addDirectory($File::Find::name);
            print " : dir\n";
          else  #zip files
           print " : file\n";
           $zip->addFile($File::Find::name) != AZ_OK ||  print "couldn't add file \n";
         

    

文件 D:\SVN-Backup\20110502-0630/db/revprops/0/0 不会添加到 zip 存档中。知道我可以做些什么来添加这个文件吗?

...
D:\SVN-Backup\20110502-0630/db/uuid : file
D:\SVN-Backup\20110502-0630/db/revprops : dir
D:\SVN-Backup\20110502-0630/db/revprops/0 : dir
D:\SVN-Backup\20110502-0630/db/revprops/0/0 : file
D:\SVN-Backup\20110502-0630/db/revprops/0/1 : file
D:\SVN-Backup\20110502-0630/db/revprops/0/10 : file
...

祝贺安迪的贡献。他解决了问题。

一个相关的错误: rt.cpan.org/Public/Bug/Display.html?id=27463, 但这只是关于文件,而不是 目录。什么版本 Archive::Zip 你有吗?

我有 perl 5.8.8,它似乎比修复更旧。

【问题讨论】:

一个相关的错误:rt.cpan.org/Public/Bug/Display.html?id=27463,但这只是关于文件,而不是目录。你有什么版本的 Archive::Zip?另外,您正在混合 / 和 \ 路径分隔符,我不知道这是否会导致问题。 另一个想法。如果在 File::Find:Rule 中禁用 chdir 会更好吗? IE。使用:find(wanted => \&zip_file, no_chdir => 1, $dir); @Andy:如果你把你的评论作为答案,我什至可以给你积分。 【参考方案1】:

我找到了CPAN bug 27463,如果您使用的是旧版本的 Archive::Zip(

正如我和 snoopy 所猜测的那样,该错误是由于文件名 "0" 在用作条件时为假。

【讨论】:

【参考方案2】:

我正在查看 Archive::Zip 的源代码。这个 addFile 方法在 Archive::Zip::Archive 中,它又在同一个源文件中调用 addMember:

sub addMember 
    my $self       = shift;
    my $newMember  = ( ref( $_[0] ) eq 'HASH' ) ? shift->member : shift;
    push( @ $self->'members' , $newMember ) if $newMember;
    return $newMember;

当 $newMember 为 '0' (false) 时,此 sub 将失败。我认为 Archive::Zip 可能需要针对它提交的 RT 票证,以及修复上述问题的补丁。

【讨论】:

我不确定是不是这个,$newMember 是这里的一个对象 @Andy 你说得对。我实际上可以将名为“0”的文件添加到存档中:-| 我也有同样的直觉,但仍有可能存在我们尚未复制的关于 Peter 的设置的某些内容,或者它可能是已经修复的错误的一个实例(请参阅我对问题的评论)。【参考方案3】:

你可以递归地添加整个目录:

    my $zip = Archive::Zip->new();
    $zip->addTree('C:\~~~\some dir', 'new name for dir');
    $zip->writeToFileNamed( 'C:\~~~\great.zip' );

这会将目录及其内容添加到 zip 存档中,并保留所有相关内容。

【讨论】:

以上是关于Perl Archive::zip -- 文件没有被添加的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

使用 Perl 从 zip 中获取目录结构 [关闭]

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

在目录中按组大小压缩文件