Как объединить zip файлы с Archive :: Zip в Perl - PullRequest
1 голос
/ 07 декабря 2011

У меня есть два архива, A.zip и B.zip. Я хочу добавить все файлы из A.zip в B.zip.

Как я могу сделать это с Archive::Zip в Perl? Я думал, что смогу сделать что-то вроде этого:

my $zipA = Archive::Zip->new();
my $zipB = Archive::Zip->new();

die 'read error' unless ($zipA->read( 'A.zip' ) == AZ_OK );

my @members = $zipA->memberNames();
for my $m (@members) {
 my $file = $zipA->removeMember($m);
 $zipB->addMember($file);
}

но если я не позвоню writeToFileNamed(), то никакие файлы не будут созданы, и, если я это сделаю, B.zip получит перезаписанные с содержимым A.zip.

Я мог бы прочитать содержимое B.zip и записать их вместе с содержимым A.zip обратно в B.zip, но это кажется действительно неэффективным. (Моя проблема на самом деле связана с миллионами текстовых файлов, сжатых в тысячи zip-файлов.)

Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Использование Archive::Zip:

my $zipA = Archive::Zip->new('A.zip');
my $zipB = Archive::Zip->new('B.zip');

foreach ($zipA->members) {
    $zipA->removeMember($_);
    $zipB->addMember($_);
}
$zipB->overwrite;

Проблема в следующем:

  1. Вам необходимо добавить реальных участников, а не только memberNames.
  2. YouМне нужно прочитать B.zip, прежде чем вы сможете добавить к нему.

(я оставлю вам заниматься обработкой ошибок и т. д.)

0 голосов
/ 07 декабря 2011

Вы можете попробовать chilkat::CkZip вместо Archive::Zip.Его QuickAppend() метод, кажется, полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...