PHP ja tiedostojen käsittely
Mureakuha
Tiedostojen lukeminen
file()
$tiedot = file("tiedosto.txt"); $url = file("http://www.mureakuha.com/");
Tässä tapauksessa siis $tiedot (Array) saa arvokseen tiedosto.txt-tekstitiedoston sisällön rivi kerrallaan. Eli:
$tiedot[0] = Ensimmäinen rivi $tiedot[1] = Toinen rivi $tiedot[n] = n:s rivi
Huomaa, että jokainen rivi päättyy rivinvaihtoon (järjestelmästä riippuen esimerkiksi \n (lisätietoa)), joten saatat tarvita trim()-funktiota.
fgets()
fgets()-funktiolla voit lukea tiedostosta rivin kerrallaan. Katsotaan kuitenkin ennen fgets()-funktiota, miten feof()-funktio toimii.
Kaikessa yksinkertaisuudessaan feof($tiedostopointteri) palauttaa TRUE tai FALSE, TRUE tulee kun tiedoston loppu tulee vastaan, muutoin funktio palauttaa arvon FALSE.
$tiedosto = fopen("tiedosto.txt","r") or die("Tiedostovirhe"); // Avataan tiedosto while(!feof($tiedosto)) // loopataan kunnes feof palauttaa TRUE { $rivi = fgets($tiedosto, 1024); // luetaan $tiedostosta rivi kerrallaan, // mutta kuitenkin vain korkeintaan 1024tavua. echo $rivi . "\n"; // tulostetaan rivi. } fclose($tiedosto); // ja tiedosto kiinni
Huomaa, että funktio fgetss() toimii muuten samalla tavalla kuin fgets(), mutta se karsii HTML- ja PHP-tagit pois tekstistä. Sallitut tagit voidaan kuitenkin määritellä funktion kolmantena parametrina.
fgetc()
fgetc() -funktio palauttaa tiedostosta merkin kerrallaan:
$tiedosto = fopen("tiedosto.txt","r") or die("Tiedostovirhe"); while(!feof($tiedosto)) { $merkki = fgetc($tiedosto); echo "$merkki\n"; } fclose($tiedosto);
Tässä siis avataan tiedosto.txt tuttuun tyyliin, loopataan tiedoston läpi whilella, luetaan merkki kerrallaan ja tulostetaan jokainen merkki omalle rivilleen.
Tiedoston käsittely
Tiedoston avaus – fopen()
Tiedoston avaus onnistuu fopen()-funktiolla. Tätä tapaa käytetään tiedoston avaukseen jos tiedostoon on tarkoitus kirjoittaa, vaikka pelkkä lukeminenkin toki onnistuu.
$tiedot = fopen("tiedosto.txt" , TYYPPI); $tiedot = fopen("http://www.mureakuha.com/", TYYPPI);
Tässä tapauksessa TYYPPI voisi olla joku seuraavista:
- r = Tiedosto avataan VAIN lukemista varten!
- r+ = Avataan tiedosto lukemista JA kirjoittamista varten, tiedostoon kirjoitus alkaa tiedoston alusta.
- w = Tiedosto avataan vain kirjoitusta varten, tuhoaa vanhan tiedoston tai ellei tiedostoa ole olemassa php luo sen.
- w+ = Avataan tiedosto lukemista JA kirjoittamista varten, pointteri alkuun ja tiedosto nollille.
- a = Tiedosto avataan vain kirjoitusta varten. Pointteri tiedoston loppuun. Luo tiedoston ellei sitä ole olemassa.
- a+ = Tiedosto avataan lukemista ja kirjoittamista varten, pointteri loppuun ja luodaan ellei tiedostoa löydy.
$tiedot = fopen("tiedosto.txt","r");
avaisi tiedoston.
Tiedoston aukaisemisessä voi käyttää myös muotoa:
$tiedot = fread("tiedosto.txt","r") or die("Tiedostovirhe");
jolloin PHP:n ajo varmasti loppuu ellei tiedostoa saada auki.
Huomaa, että jos ajat PHP:tä Windows-palvelimella, on hyvä lisätä TYYPPI:in b-kirjain. Huomaa myös, ettei pelkkä fopen() tuo tiedoston sisältöä $tiedot-muuttujaan kuten file() tekee.
Tiedoston sulkeminen – fclose()
Kaikki avatut tiedostot suljetaan automaattisesti PHP-skriptin suorituksen jälkeen, mutta on suositeltavaa sulkea avoimet tiedostot fclose-funktiolla sitä mukaan kun niitä ei enään tarvita.
fclose($fp);
Yllä olevaa esimerkkiä lukien fclose($tiedosto);
Tiedostosta lukeminen – fread()
Ensin avaamme tiedoston edellä oppimalla tavalla:
$tiedot = fopen("tiedosto.txt", "r") or die("tiedostovirhe");
Tämän jälkeen luemme sen tiedot:
$tieto = fread($tiedot, filesize("tiedosto.txt"));
Liikaa asiaa kerralla? Kerrataanpas nyt, mitä fread()-rivi teki. Sehän lukee $tieto-muuttujaan filesize($tiedot)-funktion palauttaman määrän tavuja $tiedot–tiedosto-osoittimesta (file pointer). Mikäli kirjoitat rivin muotoon fread($tiedot, 100);, luetaan tiedostosta vain ensimmäiset 100 tavua. Halutessasi lukea koko tiedoston, on filesize() kuitenkin hyödyllinen funktio.
Huomaa, ettei filesize() toimi URL:ien kanssa!
Esimerkki:
$tiedosto = fopen("tiedosto.txt","r") or die("Tiedostovirhe"); $tiedot = fread($tiedosto, filesize("tiedosto.txt")); fclose($tiedosto); $rivit = explode("\n", $tiedot); foreach ($rivit as $temp) { print "$temp\n"; }
Tutki nyt yllä olevaa esimerkkiä ja mieti miten se toimii. Kun luulet ymmärtäväsi esimerkin toiminnan, jatka lukemista.
Tiedostoon kirjoittaminen – fwrite()
Muistathan että kun aloitat tiedostoon kirjoittamisen, tulee se avata kirjoitustilaan. Esim:
$tiedosto = fopen("tiedosto.txt","w+") or die("Tiedostovirhe");
fwrite()-funktiolla voidaan kirjoittaa suoraan tiedosto-osoittimeen (pointer).
Esimerkki:
$tiedosto = fopen("tiedosto.txt", "w") or die("tiedostovirhe"); $muuttuja = "Tämä on vain esimerkki teksti"; fwrite($tiedosto, $muuttuja); fclose($tiedosto);
Eli tiedosto avataan kirjoitusta varten (kts. ylempää TYYPIT!), jonka jälkeen fwrite()-funktiolla kirjoitetaan siihen muuttujan $muuttuja sisältö. Tämän jälkeen suljetaan tiedosto.
fwrite():a voi soveltaa monella eri tavalla aina hieman tiedoston avaustyypistä riippuen. Siitä vain kokeilemaan!
Tiedoston lyhentäminen – ftruncate()
Tiedoston lopussa olevat merkit voidaan poistaa ftruncate()-funktiolla. ftruncate() ottaa kaksi parametria: ensimmäinen on tiedoston "kahva", joka on saatu fopen()-funktiolla. Toinen on tiedostoon jätettävien merkkien määrä. Esimerkiksi arvo 0 tyhjentää koko tiedoston ja arvo 100 jättää tiedostoon sata ensimmäistä merkkiä. Funktio palauttaa arvon TRUE, mikäli poisto onnitui ja FALSE, mikäli poisto jostain syystä epäonnistui.
Osoittimen siirtäminen haluttuun kohtaan tiedostoa - fseek()
fseek()-funktio ottaa kolme parametria. Ensimmäinen näistä on tiedoston "kahva", joka on saatu fopen()-funktiolla. Toinen parametri on osoittimen toivottu sijainti. Esimerkiksi arvo 0 siirtää osoittimen alkuun (vastaa funktiota rewind()). Kolmas parametri ei ole välttämätön.
fseek() palauttaa numeerisen arvon. Arvo 0 kertoo osoittimen siirron onnistuneen ja -1 kertoo toivotun osoittimen sijainnin olevan tiedoston ulkopuolella.
Osoittimen siirtäminen tiedoston alkuun - rewind()
rewind()-funktiolla on yksi parametri, tiedoston "kahva". rewind() siirtää osoittimen tiedoston alkuun (kuten tekee myös fseek($handle, 0);
Funktio palauttaa onnistuessaan arvon TRUE, muulloin FALSE.
Osoittimen sijainnin kysyminen - ftell()
ftell()-funktiolla on yksi parametri, tiedoston "kahva". Funktio palauttaa osoittimen nykyisen sijainnin tai epäonnistuessaan FALSE.
Muita tiedostoihin liittyviä funktioita
flock() - lukitsee tiedoston niin, ettei kukaan/mikään muu (esimerkiksi toinen PHP-skripti) voi muuttaa sitä sen ollessa auki.
//Esimerkki: $tiedosto = fopen("tiedosto.txt", "w+") or die("Tiedostovirhe"); if (flock($tiedosto,2)) { print "Tiedosto lukittu ja vain tämän skriptin käytössä\n"; fwrite($tiedosto, $tiedot); } fclose($tiedosto);
Ensin avataan taas tiedosto, jonka jälkeen if-lauseella tarkistetaan, että tiedosto saadaan lukittua. Tämän jälkeen kirjoitetaan tiedot tiedostoon.
flock() palauttaa TRUE, jos lukitseminen onnistuu ja FALSE ellei lukitseminen onnistu.
Numero 2 parametrina tarkoittaa, että tiedosto lukitaan kirjoitusta varten. Numero 1 lukitsisi tiedoston lukemista varten.
Tarkistusfunktiot
is_file("tiedosto.txt"); tarkistaa että kyseessä on tiedosto. is_file() palauttaa arvon TRUE mikäli kyseessä on tiedosto.
is_writeable("tiedosto.txt"); tarkistaa että tiedostoon kirjoittaminen onnistuu. is_writeable() palauttaa arvon TRUE jos tiedostoon kirjoittaminen onnistuu, muuten FALSE. Esimerkiksi ennen avausyritystä lienee hyvä tarkistaa, että tiedostoon on mahdollista kirjoittaa.
file_exists("tiedosto.txt"); tarkistaa tiedoston olemassaolon. Palauttaa TRUE jos tiedosto on olemassa, muuten FALSE.
is_readable("tiedosto.txt"); tarkistaa voidaanko tiedostosta lukea. Palauttaa arvon TRUE jos tiedostosta voidaan lukea, muuten FALSE
Tiedostojen etsiminen GLOB
Glob-funktio ottaa yhden tai useamman parametrin, joista ensimmäinen on ehto, jolla tiedostoja ja hakemistoja etsitään. Ehto on yleensä, joku polku ja tiedoston tunniste, jossa toimii *-jokerimerkkinä. Glob palauttaa löytämistään tiedostoista ja hakemistoista listan. Globin loput parametrit ovat ohjeita, kunka se toimii. esim.
- GLOB_MARK //Lisää kenoviivan
- GLOB_NOSORT //Jättää listan järjestelemättä
- GLOB_NOESCAPE //ei lopetus merkkiä lopussa (takakenoviivaa)
