Moduł Archive::Zip

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Obsługa modułu Archive::Zip

Co to jest

W ramach przypomnienia Zip - jeden z najczęściej używanych formatów kompresji na platformie IBM PC, zwłaszcza w środowisku Microsoft Windows. Archive::Zip to moduł autorstwa Adama Kennedy'ego. Moduł ten pozwala na tworzenie, odczytywanie i zapisywanie archiwów Zipa. Archiwa mogą być tworzone na nowo jak również i odczytywane z już istniejących.

Download

Instalacja w systemie UNIX'owym

Po rozpakowaniu modułu wydajemy polecenie

perl Makefile.PL make make install

Sprawdzamy, czy został on pomyślnie zainstalowany, pisząc jednolinijkowca perl -e 'use Archive::Zip' Pomyślne wykonanie programu (żadnych komunikatów) daje nadzieję, że moduł został zainstalowany poprawnie i będzie działał. Jeżeli wszystko poszło zgodnie z planem to możemy już korzystać z możliwości naszego nowego modułu.

Konstruktor

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

lub

my $zip = Archive::Zip->new( 'xyz.zip' );

Jeżeli dany jest dodatkowy argument, a odczyt zawiedzie z jakiegoś powodu, to new() zwróci wartość undef. Z tego powodu lepiej wykonywać read() oddzielnie.

Wybrane metody klasy

Archive::Zip::setChunkSize( $number )
Raportuje lub zmienia rozmiar bloku potrzebnego do zapisu lub odczytu. Przydaje się przy radzeniu sobie z dyżymi plikami. Domyślnie wartość jest ustawiona na 32K.

Archive::Zip::chunkSize()
Zwraca obecny rozmiar bloku.

Archive::Zip::tempFile( [$tmpdir] )
Tworzy tymczasowy plik, zwraca wejście dla odczytu/zapisu. Jeżeli $tmpdir jest określone, to nasz plik zostanie utworzony w katalogu o podanej nazwie.

Dostępne metody obiektu

removeMember( $memberOrName )
Usuwa i zwraca podany element obiektu zip, zwraca undef jeżeli taki element nie istnieje.

replaceMember( $memberOrName, $newMember )
Usuwa i zwraca podany element obiektu zip, zastępując go nowym elementem. Zwraca undef jeżeli taki element nie istnieje lub jeżeli nowy element jest niezdefiniowany.

extractMember( $memberOrName [, $extractedName ] )
Rozpakowuje dany element obiektu, zwraca undef jeżeli taki element nie istnieje. Jeżeli podany jest drugi argument, to będzie on użyty jako nazwa wypakowanego elementu.

extractMemberWithoutPaths( $memberOrName [, $extractedName ] )
Rozpakowuje dany element, nie bierze pod uwagę informacji o ścieżce, wypakowuje do obecnego katalogu. Jeżeli podany jest drugi argument, to będzie on użyty jako nazwa wypakowanego elementu (jego ścieżka będzie również usunięta).

addMember( $member )
Dodaje element (możliwość dodania z innego pliku zip) do archiwum zip, zwraca nowy element. Zazwyczaj używa się addFile(), addDirectory(), addFileOrDirectory(), addString() lub read() do dodawania elementów.
# Przesuwamy element 'abc' na koniec zipa my $member = $zip->removeMember( 'abc' ); $zip->addMember( $member );

updateMember( $memberOrName, $fileName )
Uaktualnia pojedynczy element z pliku lub katalogu podanego jako $fileName. Zwraca (dodany lub uaktualniony) element lub undef w przypadku błędów.

addFile( $fileName [, $newName ] )
Dodaje element, którego dane pochodzą z zewnętrznego pliku, zwraca element jeżeli wszystko poszło pomyślnie lub undef w przypadku błędów. Dodany element będzie miał nazwę taką jak plik z którego powstaje.

addDirectory( $directoryName [, $fileName ] )
Dodaje elementy z podanego katalogu. Drugi argument ustawia nazwę elementu archiwum (nazwa musi być w formacie Unixowym). Zwraca nowy element.

addFileOrDirectory( $name [, $newName ] )
Dodaje element z pliku lub katalogu podanego jakio $name. Drugi argument $newName, zostanie użyty jako nazwa nowego elementu.

addString( $stringOrStringRef, $name )
Dodaje element utworzony ze stringa lub referencji do stringa. Nazwa jest dodawana jako drugi argument.
my $member = $zip->addString( 'Jakiś tekst', 'test.txt' );
contents( $memberOrMemberName [, $newContents ] )
Zwraca nieskompresowane dane z konkretnego elementu lub undef. Może również zmieniać zawartość elementu.
# Zwraca nieskompresowane dane z konkretnego elementu. print "xyz.txt zawiera " . $zip->contents( 'xyz.txt' ); # Zmienia również zawartość elementu $zip->contents( 'xyz.txt', 'Nowa zawartość' );

Operacje I/O

Archiwum zip może być zapisywane do pliku lub też jego deskryptora jak również i odczytywane.

writeToFileNamed( $fileName )
Zapisuje archiwum zip jako plik o podanej nazwie. Zwraca AZ_OK jeżeli wszystko się powiodło
my $status = $zip->writeToFileNamed( 'xx.zip' ); die "Jakiś błąd" if $status != AZ_OK;
writeToFileHandle( $fileHandle [, $seekable] )
Zapisuje archiwum zip do uchwytu pliku. Zwraca AZ_OK jeżeli wszystko się powiodło.
writeCentralDirectory( $fileHandle [, $offset ] )
Zapisuje strukturę katalogu głównego do deskryptora pliku. Zwraca AZ_OK jeżeli wszystko się powiodło.
overwriteAs( $newName )
Zapisuje zip'a do pliku o podanej nazwie w bezpieczny sposób (najpierw zawartość jest zapisywana do tymaczasowego pliku, następnie wykonywana jest zmiana nazwy oryginalnego pliku jeżeli istnieje, zmiana nazwy pliku tymczasowego oraz usuwanie oryginalu jeżeli istniał). Zwraca AZ_OK jeżeli wszystko się powiodło.
overwrite()
Nadpisuje oryginalny plik zip.
read( $fileName )
Wczytuje nagłówki pliku zip, dodając nowy element. Zwraca AZ_OK jeżeli wszystko się powiodło lub kod błędu w przeciwnym przypadku. my $zipFile = Archive::Zip->new(); my $status = $zipFile->read( '/some/FileName.zip' );
readFromFileHandle( $fileHandle, $filename )
Wczytuje nagłówki pliku zip z dotychczas otwartego deskryptora pliku, dodając nowy element. Operacja ta nie zamyka deskryptora. Zwraca AZ_OK jeżeli wszystko się powiodło lub kod błędu w przeciwnym przypadku.

Dodatki Zip Archive

members()
Zwraca tablicę kopii elementów należących do obiektu zip my @members = $zip->members();
numberOfMembers()
Zwraca listę nazw plików należących do obiektu zip
memberNamed( $string )
Zwraca referencję do elementu obiektu zip, którego nazwa odpowiada podanemu stringowi lub undef w przypadku niepowodzenia.
membersMatching( $regex )
Zwraca tablicę elementów należących do obiektu zip, pasujących nazwą do nazw plików podanych jako regexp lub numer pasujących elementów w kontekście skalarnym.
my @textFileMembers = $zip->membersMatching( '.*\.txt' );

lub

my $numberOfTextFiles = $zip->membersMatching( '.*\.txt' );
centralDirectorySize()
Zwraca rozmiar katalogu głównego z którego odczytujemy plik zip.
zipfileComment( [$string] )
Pobiera lub ustawia komentarz pliku zip. Zwraca stary komentarz. print $zip->zipfileComment();

lub

$zip->zipfileComment( 'Nowy komentarz' );
fileName()
Zwraca nazwę ostatniego, odczytanego pliku. Jeżeli nic nie zostało odczytane, to zwraca pusty string. Jeżeli odczyt był z uchwytu do pliku to zwraca uchwyt w formie stringa.

Przykład

use strict; use Archive::Zip; # Konstruktor my $zip = Archive::Zip->new(); # Dodajemy katalog my $dir_member = $zip->addDirectory( 'perl/' ); # Dodajemy plik z zawartością stringa my $string_member = $zip->addString( 'Program przykładowy', 'plik.txt' ); # Dodajemy plik z dysku my $file_member = $zip->addFile( 'abc.pl', 'Inna_nazwa.pl' ); # Zapisujemy plik unless ( $zip->writeToFileNamed('jakas_nazwa_pliku.zip') == AZ_OK ) { die 'Błąd zapisu'; } # Odczytujemy plik zip my $somezip = Archive::Zip->new(); unless ( $somezip->read( 'jakis.zip' ) == AZ_OK ) { die 'Błąd odczytu'; } # Zmiana typu kompresji dla pliku w zip'ie my $member = $somezip->memberNamed( 'plik_w_zipie.txt' ); $member->desiredCompressionMethod( COMPRESSION_STORED ); unless ( $zip->writeToFileNamed( 'inny_zip.zip' ) == AZ_OK ) { die 'Błąd zapsiu'; }

Dodatkowe informacje

Opisałem tutaj tylko wybrane metody, moduł ten posiada o wiele większe możliwości. Może być wykorzystywany przy wszelkich manipulacjach dotyczących archiwizacji. Po bardziej szczegółowe informacje odsyłam na strone z dokumentacją.

Autor opracowania

Adrian Sielski

Email: adrian.sielski@gmail.com

Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.