Das ZIP-Dateiformat ist ein offenes Format zur komprimierten Archivierung von Dateien. Neben mehreren Dateien können auch ganze Verzeichnisbäume in einer einzelnen ZIP-Datei archiviert und komprimiert werden.
Archive::Zip von Adam Kennedy ermöglicht das Erstellen und Entpacken von Zip-Archiven
Die Handbuchseite zu Archive::Zip ist ziemlich verwirrend. Glücklicherweise befinden sich in der Source-Code Distribution (Archive-Zip-1.23.tar.gz) im Ordner examples zahlreiche Beispiele zur Verwendung von Archive::Zip, von denen ich hier zwei vorstelle:
Verzeichnisse und Dateien zippen
Das Beispielprogramm zip.pl aus dem examples Verzeichnis ist genau das gewünschte Tool.
zip.pl
#!/bin/perl -w # Creates a zip file, adding the given directories and files. # Usage: # perl zip.pl zipfile.zip file [...] use strict; use Archive::Zip qw(:ERROR_CODES :CONSTANTS); die "usage: $0 zipfile.zip file [...]\n" if (scalar(@ARGV) < 2); my $zipName = shift(@ARGV); my $zip = Archive::Zip->new(); foreach my $memberName (map { glob } @ARGV) { if (-d $memberName ) { warn "Can't add tree $memberName\n" if $zip->addTree( $memberName, $memberName ) != AZ_OK; } else { $zip->addFile( $memberName ) or warn "Can't add file $memberName\n"; } } my $status = $zip->writeToFileNamed($zipName); exit $status;
Anwendungsbeispiele:
Komplettes Verzeichnis zippen
perl zip.pl test.zip examples
oder auch
perl zip.pl test.zip examples/*
Einzelne Dateien zippen
perl zip.pl test.zip datei1.doc datei2.doc dateiN.doc
Zip-Dateien entpacken
Auch hier findet man das gewünschte Tool als Beispielprogramm unzipAll.pl im examples Verzeichnis.
unzipAll.pl
#!/bin/perl -w # Extracts all files from the given zip # $Revision: 1.3 $ # usage: # perl unzipAll.pl [-j] zipfile.zip # if -j option given, discards paths. # use strict; use vars qw( $opt_j ); use Archive::Zip qw(:ERROR_CODES); use Getopt::Std; $opt_j = 0; getopts('j'); if (@ARGV < 1) { die <<EOF usage: perl $0 [-j] zipfile.zip if -j option given, discards paths. EOF } my $zip = Archive::Zip->new(); my $zipName = shift(@ARGV); my $status = $zip->read( $zipName ); die "Read of $zipName failed\n" if $status != AZ_OK; $zip->extractTree();
Anwendungsbeispiel:
$ perl unzipAll.pl X.zip
Known Bugs
Mit Archive::Zip erstellte Archive lassen sich nicht immer mit Windows-Bordmitteln öffnen. Die Behebung dieses Fehlers ist derzeit in Arbeit. Achten Sie ggf. auf neuere Versionen.
2011/05/05: error in script zip.pl
Can't call method "desiredCompressionLevel" on an undefined value at C:/strawber
ry/perl/vendor/lib/Archive/Zip/Archive.pm line 249.
windows xp, perl 5, version 12, subversion 1 (v5.12.1) built for MSWin32x86-multi thread
dg
Hall Daniel, guck doch mal hier: Perlmonks: problem with Archive::Zip.
Gruß, Thomas