PHP ja tiedostojen käsittely

Mureakuha

Loikkaa: valikkoon, hakuun

Sisällysluettelo

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.
eli
$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)
Henkilökohtaiset työkalut