Hoe zip-bestanden combineren met Archive :: Zip in Perl

Ik heb twee zip-bestanden, A.zip en B.zip . Ik wil alle bestanden in A.zip toevoegen aan B.zip .

Hoe kan ik dit doen met Archive :: Zip in Perl? Ik dacht dat ik zoiets kon doen:

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);
}

maar tenzij ik writeToFileNamed() aanroept, worden er geen bestanden aangemaakt en als ik het wel noem, krijgt B.zip overschreven met de inhoud van A.zip .

Ik kon de inhoud van B.zip lezen en deze samen met de inhoud van A.zip terug naar B.zip schrijven, maar dit lijkt echt inefficiënt. (Mijn probleem omvat eigenlijk miljoenen tekstbestanden die zijn gecomprimeerd tot duizenden zip-bestanden.)

Is er een betere manier om dit te doen?

1

2 antwoord

Gebruik 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;

Het probleem is:

  1. U moet de daadwerkelijke leden toevoegen, niet alleen de ledennamen.
  2. U moet B.zip lezen voordat u het kunt toevoegen.

(Ik laat het aan jou over om fouten af ​​te handelen enz.)

2
toegevoegd
Nee, maar het zat daar in de originele code
toegevoegd de auteur stevenl, de bron
Is $ zipA-> removeMember ($ _); echt nodig?
toegevoegd de auteur Brad Gilbert, de bron

U kunt proberen chilkat :: CkZip in plaats van Archive :: Zip . De QuickAppend() methode lijkt nuttig te zijn.

0
toegevoegd