Domov arrow 2. PHP arrow 2.14 Delo z datotekami arrow 2.14.2 Ravnanje z datotekami arrow 2.14.2.4 Odpiranje in zapiranje datotek za postopke branja in pisanja


2.14.2.4 Odpiranje in zapiranje datotek za postopke branja in pisanja Natisni E-pošta
PHP ima tudi skupek funkcij, ki omogočajo odpiranje datoteke, branje in/ali pisanje v njo in nato zapiranje datoteke. Tu je potrebno več prehodov. Najbolj pomembne funkcije v teh primerih so:
-    fopen(): odpre datoteko,
-    fgets(): prebere vsebino datoteke, ponavadi eno vrstico naenkrat,
-    fread(): prebere določeno količino datoteke,
-    fwrite(): piše v datoteko,
-    feof(): določa ali je bil dosežen konec datoteke,
-    rewind(): premakne notranji kazalec na vrh datoteke,
-    fclose(): zapre datoteko.

Najtežja za razumevanje je funkcija fopen(), ker moraš določiti, kako naj bo datoteka uporabljena, ko je enkrat odprta. Funkcija fopen() ima en način samo za branje, tri načine samo za pisanje in štiri načine za branje in pisanje (tabela 9). Včasih želiš prepisati obstoječo vsebino, drugič želiš dodati nov material. Naslednjič spet želiš, da PHP ustvari datoteko, če še ne obstoja. Pomembno pri vsem tem je tudi, kam vsak način postavi notranji kazalec, ko odpre datoteko.

Tabela 9: Načini branja/pisanja uporabljeni z fopen()

Tip    Način    Opis
Read-only    r    Notranji kazalec je postavljen na začetek datoteke.
Write-only    w    Obstoječi podatki so zbrisani pred pisanjem. Ustvari datoteko, če še ne obstoja.
    a    Način pripenjanja. Novi podatki so dodani na konec datoteke. Ustvari datoteko, če še ne obstoja.
    x    Ustvari datoteko, če še ne obstoja, tako da ni nevarnosti izbrisa obstoječih podatkov.
Read/write    r+    Bralno/pisalne operacije se lahko vršijo v kateremkoli vrstnem redu in se začnejo tam, kjer je takrat notranji kazalec. Prvotno je postavljen na začetek datoteke. Datoteka mora že obstajati, da je operacija uspešna.
    w+    Obstoječi podatki so zbrisani. Podatke se po pisanju lahko prebere nazaj. Ustvari datoteko, če še ne obstoja.
    a+     Odpre datoteko pripravljeno za dodajanje novih podatkov na koncu datoteke. Prav tako dovoli, da se podatki preberejo nazaj po tem, ko je bil notranji kazalec premaknjen. Ustvari datoteko, če še ne obstoja.
    x+    Ustvari novo datoteko, a ne uspe, če datoteka z istim imenom že obstoja. Podatki se po pisanju lahko prebere nazaj.

Če izbereš napačen način, lahko prepišeš ali izbrišeš dragocene podatke. Pozoren moraš biti na položaj notranjega kazalca. Če je kazalec na koncu datoteke in želiš prebrati vsebino, ne boš prebral ničesar. Po drugi strani pa se ti lahko zgodi da, če je kazalec na začetku datoteke in začneš pisati, boš prepisal enakovredno količino že obstoječih podatkov.

Z fopen() se dela na način, da mu posreduješ dva argumenta:
- pot do datoteke, ki jo želiš odpreti,
- enega od načinov, ki so opisani v tabeli 9.

Funkcija fopen() vrne povezavo na odprto datoteko, ki je lahko nato uporabljena s katerokoli bralno/pisalno funkcijo. Primer za odpiranje tekstovne datoteke samo za branje:

$datoteka = fopen('C:/matej/test03.txt','r');

Nato pošlješ spremenljivko $datoteka kot argument drugim funkcijam kot so fgets(), feof() in fclose(). Primer:

<?php
// shrani pot do datoteke
$ime_datoteke = 'C:/matej/test03.txt';
// odpri datoteko v načinu samo za branje
$datoteka = fopen($ime_datoteke, 'r');
// preberi datoteko in shrani njeno vsebino
$vsebina = fread($datoteka, filesize($ime_datoteke));
// zapri datoteko
fclose($datoteka);
//prikaži vsebino
echo nl2br($vsebina):
?>

Za razliko od funkcije file_get_contents mora funkcija fread() vedeti koliko datoteke naj prebere. Zato je potrebno podati drugi argument, ki prikazuje število bajtov. To je uporabno, če želiš prebrati le npr. prvih 100 znakov besedilne datoteke. Če želiš prebrati celotno datoteko, moraš poslati pot do datoteke funkciji filesize(), da dobiš pravilno vrednost. Funkcija nl2br() v zadnji vrstici skripte pretvori znake za novo vrstico v XHTML <br /> značke.

Drug način za branje vsebine datotek z fopen() je uporaba funkcije fgets(), ki izvleče samo  eno vrstico naenkrat. To pomeni, da moraš uporabiti še while zanko v povezavi s funkcijo feof(), da prebereš čisto do konca datoteke:

// ustvari spremenljivko za shrambo vsebine
$vsebina = '';
// uporabi zanko za vsako vrstico do konca datoteke
while (!feof($datoteka)) {
    // izvleči naslednjo vrstico in dodaj spremenljivki $vsebina
    $vsebina .= fgets($datoteka);
    }

Oba načina sta daljša od uporabe file()-a ali file_get_contents()-a. Vendar moraš uporabiti ali fread() ali fgets(), če želiš hkrati brati vsebino datoteke in zapisovati vanjo.
 


© 2007-2008 PHP, MySQL, XML, OOP, varnost