Kirjautuminen

Haku

Tehtävät

Opasarkisto: PHP: PclZip-opas

Kirjoittaja: tsuriga. Vuosi: 2004.

Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi.

Kuten nimikin jo sanoo, tämä opas ei käsittelekään PHP:n manuaalissa selostetun ZZIPlibin käyttöä vaan paneutuu Vincent Blavetin kehittämän PHP-luokan PclZip julkaisuversio 2.1:een (nämä perustiedot pätevät luultavati myös myöhemmissä versioissa). Luokan etuina ZZIPlibiin nähden voidaan mainita Zip-tiedostojen luonti, jota ZZIPlibillä ei voi tehdä.

Asennus

Hae uusin julkaisu PHPConceptin sivuilta ja pura se jonnekin (kts. seuraava luku).

Käyttö

Kopioi pclzip.lib.php-tiedosto samaan kansioon, minne aiot tallentaa PHP-skriptisi, joka käyttää luokkaa PclZip. Tämä ei ole pakollista, mutta helpottaa luokan esittelyä koodissa. Toinen vaihtoehto on kopioida se PHP-kansioosi.

Tiedoston avaus ja sen tietojen hakeminen

<?php
// Luezip.php
require_once 'pclzip.lib.php';	// haetaan tarvittava PclZip-kirjasto

$myzip = "myZip.zip";		// zip-tiedoston polku
$zippi = new PclZip($myzip);	// avataan zip-tiedosto

// tarkistetaan onko annettua tiedostoa olemassa
if (!file_exists($myzip)) die("ERROR in module: Arkistoa " . $myzip . " ei ole olemassa");

// haetaan zipin data taulukkoon
if (($zipdata = $zippi->listContent()) ==  0) // Jos ei voida hakea zipin sisältöä
  die("ERROR in module: " . $zippi->errorInfo(true));

$tiedostoja = count($zipdata); // lasketaan tiedostojen määrä

// loopataan zipdata-taulukon tiedot läpi
for($i = 0; $i < $tiedostoja; $i++) {
// haetaan zip-tiedostossa olevan tiedoston tiedot taulukkoon ja eritellään ne
  $tdata = $zipdata[$i];
  $nimi = $tdata['filename'];		// tiedoston pakkausnimi
  $tkoko = $tdata['size'];		// tiedoston todellinen koko
  $pkoko = $tdata['compressed_size'];	// tiedoston pakkauskoko

  echo "Tiedosto " . $i . ":\n";
  echo "Tiedostonimi: " . $nimi . "\n";
  echo "Todellinen koko: " . $tkoko . " tavua\n";
  echo "Pakkauskoko: " . $pkoko . " tavua";
  }
?>

Tiedoston luominen ja sinne tallentaminen

<?php
// Luozip.php
require_once 'pclzip.lib.php';	// haetaan tarvittava kirjasto

$myzip = "myZip.zip";		// luotavan zipin nimi
$myfile = "pclzip.lib.php";     // arkistoon lisättävä tiedosto

$zippi = new PclZip($myzip);	// luodaan PclZip-luokasta instanssi

/* tarkistetaan, ettei tiedostoa ole jo olemassa, koska muuten
 * tämä kirjoittaa uuden tyhjän zipin siihen päälle */
if (!@file_exists($myzip)) {

// luodaan tyhjä zip-tiedosto ja tarkistetaan, ettei arkistoa luodessa tapahtunut virheitä
  if ($zippi->create("") == 0) die("ERROR in module: " . $zippi->errorInfo(true));
  else echo "Zipin " . $myzip . " luominen onnistui\n";

// lisätään tiedosto äsken luotuun zip-tiedostoon
// tämän voisi tehdä myös arkistoa luodessa: create($myfile, $myfile2..)
  if ($zippi->add($myfile)==0) die("ERROR in module: " . $zippi->errorInfo(true));
  else echo "Tiedoston " . $myfile . " lisääminen arkistoon " . $myzip . " onnistui";
  }
else echo "Arkisto " . $myzip . " on jo olemassa";
?>

Tiedostojen purkaminen ja poistaminen

<?php
// Moo.php - en keksinyt parempaakaan kun tässä tehdään eri asioita (ja moo on aina hyvä)

$myzip = "myZip.zip";		// Zippitiedoston polku
require_once('pclzip.lib.php');	// haetaan tarvittava kirjasto
$zippi = new PclZip($myzip);	// avataan zip-tiedosto

// tarkistetaan onko tiedosto olemassa
if (!file_exists($myzip)) die("ERROR in module: Arkistoa " . $myzip . " ei ole olemassa");

// yritetään purkaa tiedostoja kansioon nimeltä "testi"
if ($zippi->extract(PCLZIP_OPT_ADD_PATH, 'testi') == 0) {
  die("ERROR in module: " . $zippi->errorInfo(true)); }
else echo "Tiedostojen purkaminen onnistui\n";

// yritetään poistaa arkistosta tiedostot indekseistä 0-2
// tiedostot ovat arkistossa lisäysjärjestyksessä
if ($zippi->delete(PCLZIP_OPT_BY_INDEX, '0-2') == 0) {
  die("ERROR in module: ".$zippi->errorInfo(true)); }
else echo "Tiedostot poistettu indekseistä 0-2";

?>

Palautusarvot

Funktio listContents() palauttaa taulukon, joka sisältää jokaiselle zipissä olevalle tiedostolle on oma taulukkonsa. Zip-tiedostosta haetun merkinnän ominaisuustaulukossa avaimet ovat merkkijonoja ja ne kuvaavat seuraavia asioita:
(Tiedosto viittaa alla olevassa taulukossa zip-tiedostossa olevaan merkintään)

AvainArvo
filenameTiedoston nimi. Lisätessä se on funktiolle annettu parametri, purkaessa taas purettavan tiedoston todellinen nimi.
stored_filenameTiedoston pakkausnimi
sizeTiedoston oikea koko tavuina
compressed_sizeTiedoston pakkauskoko tavuina
mtimeViimeisin muokkaus (UNIX aikaleima)
commentTiedoston kommentit
folderTrue jos haettu zip-merkintä on hakemisto, false jos tiedosto
indexTiedoston indeksi zip-tiedostossa
contentTiedoston sisältö jos PCLZIP_OPT_EXTRACT_AS_STRING on valittu
statusViimeisimmän tapahtuman tulos (kts. manuaali)

Loppusanat

Lisää PclZipin toiminnasta voi oppia joko tutkailemalla sen lähdekoodia tai lukemalla manuaalia, joka löytyy täältä. Korjaus- ja parannusehdotuksia, asennusohjeita muille käyttöjärjestelmille sekä vinkkejä liittyen tähän lisäosaan voi kirjoittaa kommentteihin tai sähköpostiini. Muista lisäosaan liittyvistä ongelmista voi keskustella mieluiten keskustelualueella. Jos opas on mielestäsi liian kattava, valita siitä kommentteihin niin poistan jotain :).

Kiitokset Linkulle oppaan testaamisesta.

Kommentit

Axuu [09.03.2005 21:16:15]

Lainaa #

Ei oo kommentointu joten kommentoidaan vähän.(vaikka on tehty vähä aikaa sit).

Selkee opas ja hyvä. (Mitä muuta voi sanoa?) Tälläst just tarvitsin.
Toimii hyvin sekä debianissani ja xp:ssäni.

Sweiz [09.08.2005 16:52:37]

Lainaa #

Hyvä on...

T.M. [05.05.2006 00:08:35]

Lainaa #

Kuinka tuo PCLZIP_OPT_EXTRACT_IN_STRING toimii ? En löytänyt mitään millä olisin saanut sen toimimaan.
Pitänee kaivaa koodia ja koodata oma palikka sinne väliin (taas) Käytin tätä jo yhdessä projektissani.

tsuriga [10.05.2006 14:15:33]

Lainaa #

Hyvä huomio, oppaassa on typo. Oikea parametri on PCLZIP_OPT_EXTRACT_AS_STRING, virhe korjattu.

T.M. [19.05.2006 11:50:34]

Lainaa #

Moo.php kirjoitti:

// yritetään poistaa paketista indeksit 0-2
// indeksit ovat siinä järjestyksessä kun tiedostot on lisätty pakettiin

Voisitko hieman selittää mitä nuo indeksien poistot tarkoittavat? Miksi ne pitää poistaa? Mitä ne ovat? jne.

tsuriga [09.10.2007 07:34:37]

Lainaa #

Muokkasin opasta vihdoin. Indekseillä tarkoitin siis tiedostoja, jotka ovat arkistossa kuin taulukossa konsanaan.

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta