Moduł Archive::Zip
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
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
- Pakiet możemy pobrać z CPANu
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ą.
- Macierzysta strona dokumentacji do modułu http://search.cpan.org/~adamk/Archive-Zip-1.20/lib/Archive/Zip.pm
- Compress-Zlib http://search.cpan.org/~pmqs/Compress-Zlib-2.004/lib/Compress/Zlib.pm
- Archive::Tar http://search.cpan.org/~kane/Archive-Tar-1.32/lib/Archive/Tar.pm
Autor opracowania
Adrian Sielski
Email: adrian.sielski@gmail.com