Perl Archive :: zip - файл не добавляется - PullRequest
2 голосов
/ 04 мая 2011

Я перебираю дерево каталогов (резервная копия 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
...

Поздравляю Энди за его вклад. Он решил проблему.

Связанная ошибка: rt.cpan.org / Public / Bug / display.html? ID = 27463 , но это только о файлах, а не каталоги. Какая версия Архив :: Zip у вас есть?

У меня есть Perl 5.8.8, который кажется старше, чем исправление.

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Я обнаружил Ошибка CPAN 27463 , которая могла бы объяснить проблему, если у вас установлена ​​более старая версия Archive :: Zip (<= 1,20, насколько я могу судить по CPAN). </p>

Как и я, и snoopy, я догадался, ошибка была связана с тем, что имя файла "0" было ложным при использовании в качестве условия.

2 голосов
/ 04 мая 2011

Я смотрю на исходный код для 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'(ложный).Я думаю, что Archive :: Zip может понадобиться RT билет, поданный против него, с патчем, чтобы исправить вышеперечисленное.

0 голосов
/ 27 марта 2012

Вы можете рекурсивно добавить весь каталог:

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

Это добавит каталог и его содержимое в zip-архив со всеми относительными сохранениями.

...