Archive::Zip - Verzeichnisse und Dateien im Zip-Format packen und entpacken

Veröffentlicht von Thomas Fahle am (Permalink)

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.

Siehe auch:

Weitere Posts