Kirjoittaja: tsuriga (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ä.
Hae uusin julkaisu PHPConceptin sivuilta ja pura se jonnekin (kts. seuraava luku).
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"; ?>
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)
Avain | Arvo |
filename | Tiedoston nimi. Lisätessä se on funktiolle annettu parametri, purkaessa taas purettavan tiedoston todellinen nimi. |
stored_filename | Tiedoston pakkausnimi |
size | Tiedoston oikea koko tavuina |
compressed_size | Tiedoston pakkauskoko tavuina |
mtime | Viimeisin muokkaus (UNIX aikaleima) |
comment | Tiedoston kommentit |
folder | True jos haettu zip-merkintä on hakemisto, false jos tiedosto |
index | Tiedoston indeksi zip-tiedostossa |
content | Tiedoston sisältö jos PCLZIP_OPT_EXTRACT_AS_STRING on valittu |
status | Viimeisimmän tapahtuman tulos (kts. manuaali) |
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.
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.
Hyvä on...
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.
Hyvä huomio, oppaassa on typo. Oikea parametri on PCLZIP_OPT_EXTRACT_AS_STRING, virhe korjattu.
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.
Muokkasin opasta vihdoin. Indekseillä tarkoitin siis tiedostoja, jotka ovat arkistossa kuin taulukossa konsanaan.
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.