2011-05-03 54 views
2

我正在遍历一个目录树(subversion备份),并将我找到的每个文件和目录添加到一个zip文件中。这工作很漂亮。但是有两个文件丢失。Perl档案:: 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-备份\ 20110502-0630 /分贝/的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这看起来比修复更老。

+1

一个相关的错误:http://rt.cpan.org/Public/Bug/Display.html?id=27463,但这只是关于文件,而不是目录。你有什么版本的Archive :: Zip?此外,你正在混合/和\路径分隔符,我不知道这是否会导致问题。另一个想法是 – Andy 2011-05-03 22:31:17

+0

。如果在File :: Find:Rule中禁用chdir,它会更好吗?即使用:find({wanted => \&zip_file,no_chdir => 1},$ dir); – dwarring 2011-05-04 02:37:24

+0

@Andy:如果你把你的评论作为答案,我甚至可以给你信用额外的积分。 – 2011-05-04 18:57:17

回答

3

我发现CPAN bug 27463,这可以解释的问题,如果你有一个旧版本的归档::邮编(< = 1.20,尽我可以从CPAN告诉)。

由于我和史诺比都猜到了,这个错误是由于文件名"0"在用作条件时是错误的。

2

我正在看一看Archive :: Zip的源代码。这addFile方法是 Archive::Zip::Archive,这又同一个源文件中要求使用addMember:当$ newMember为“0”

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

这个子会失败(假)。我认为Archive :: Zip可能需要提交一个RT票据,并用修补程序来解决上述问题。

+0

我不确定这是可能的,'$ newMember'是这里的一个对象 – Andy 2011-05-03 22:29:09

+0

@Andy Youre'是的。我实际上可以将一个名为'0'的文件添加到存档中: - | – dwarring 2011-05-04 00:13:11

+0

我有同样的直觉,并且仍然有可能有关于Peter的设置,我们还没有复制,或者它可能是一个已经修复的错误的实例(请参阅我对该问题的评论)。 – Andy 2011-05-04 00:24:48

0

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

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

这将增加目录和它的内容,以ZIP压缩包的所有相对保留的。