Perl Archive :: zip - 文件未添加

时间:2011-05-03 20:41:55

标签: perl zip archive

我正在遍历目录树(subversion备份)并将我找到的每个文件和目录添加到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
...

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

  

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

我有per.8 5.8.8,它似乎比修复版旧。

3 个答案:

答案 0 :(得分:3)

我找到了CPAN bug 27463,如果你有旧版本的Archive :: Zip(< = 1.20,我可以从CPAN那里得知),这可以解释这个问题。

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

答案 1 :(得分: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)时,此子将失败。我认为Archive :: Zip可能需要针对它提交的RT票证,并附带修补程序以修复上述内容。

答案 2 :(得分:0)

您可以递归添加整个目录:

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

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