online: 4; azi: 1079; total: 53085 Webdesign - Phpmysql - 21

Lucrul cu fisiere (1)

  • Invatati sa obtineti atributele unui fisier
  • Invatati despre privilegiile unui fisier si utilizarea acestora
  • Invatati sa deschideti si sa inchideti fisiere

1. Obtinerea atributelor unui fisier

Privilegiile asociate unui fisier sau unui catalog determina operatiile pe care le poate executa un utilizator cu fisierul sau catalogul respectiv.
Pentru a adauga un fisier intr-un director, folosind PHP, trebuie sa aveti permisiunea de scriere in acel director, de asemenea, pentru a adauga date intr-un fisier, trebuie sa aveti permisiunea de scriere in fisierul respectiv.
Aceste permisiuni sunt date (configurate) de administratorul sistemului respectiv.
PHP furnizeaza numeroase functii care va permit sa obtineti informatii care descriu un fisier. Tabelul urmator rezuma cele mai cunoscute dintre aceste functii.

Functii PHP pentru obtinerea atributelor unui fisier
Functie Descriere
file_exists() - Returneaza TRUE daca fisierul specificat exista, respectiv FALSE în caz contrar
fileatime() - Returneaza timpul de acces la fisier sub forma de amprenta de timp UNIX.
filectime() - Returneaza timpul de modificare al i-nodului (structura de date care contine informatii despre fisiere UNIX - N. T.) sub forma de amprenta de timp UNIX.
filegroup() - Returneaza identificatorul numeric al grupului care detine fisierul
filemtime() - Returneaza momentul de timp al modificarii fisierului sub forma de amprenta de timp UNIX
fileowner() - Returneaza identificatorul numeric de utilizator al fisierului
fileperms() - Returneaza permisiunile fisierului
filesize() - Returneaza dimensiunea fisierului, în octeti
filetype() - Returneaza tipul fisierului, în speta "fifo", "char", "dir", "block", "link", "file" sau "unknown"
is_dir() - Returneaza TRUE daca directorul specificat exista; în caz contrar, returneaza FALSE
is_file() - Returneaza TRUE daca fisierul specificat exista; în caz contrar, returneaza FALSE
is_readable() - Returneaza TRUE daca fisierul specificat exista si poate fi citit; în caz contrar, returneaza FALSE
is_writable() - Returneaza TRUE daca fisierul specificat exista si se poate scrie în acel fisier; în caz contrar, returneaza FALSE
Functiile fileowner() si filegroup() returneaza fiecare un identificator numeric; puteti converti identificatorul numeric într-un sir prin invocarea functiei posix_getpwuid() cu un identificator de utilizator, respectiv a functiei posix_getgrgid() cu un identificat de grup. Acestea returneaza informatii despre identificatorul precizat.
Iata un exemplu in care puteti vedea, si intelege mai bine, cum sunt folosite functiile rezentate in tabelul anterior (fisierul 'test.txt' care va fi folosit de functii se afla in acelasi director cu scriptul php):
<?php
$filename = "test.txt";

$result = file_exists($filename);
echo "<br /> file_exists(): $result";

$result = fileowner($filename);
echo "<br /> fileowner(): $result";

$result = filegroup($filename);
echo "<br /> filegroup(): $result";

$result = filetype($filename);
echo "<br /> filetype(): $result";

$result = filesize($filename);
echo "<br /> filesize(): $result";

$result = fileatime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> fileatime(): $result";

$result = filectime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> filectime(): $result";

$result = filemtime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> filemtime(): $result";

$result = fileperms($filename);
$result = decoct($result);
echo "<br /> fileperms(): $result";

$result = is_file($filename);
echo "<br /> is_file(): $result";

$result = is_dir($filename);
echo "<br /> is_dir(): $result";

$result = is_readable($filename);
echo "<br /> is_readable(): $result";
$result = is_writable($filename);
echo "<br /> is_writable(): $result";
?>
Datele de iesire ale exemplului sunt urmatoarele
file_exists(): 1
fileowner(): 0
filegroup(): 0
filetype(): file
filesize(): 5
fileatime(): 08/28/2008 00:00
filectime(): 08/28/2008 10:49
filemtime(): 08/28/2008 11:32
fileperms(): 100666
is_file(): 1
is_dir():
is_readable(): 1
is_writable(): 1

- O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina -> Functii pentru fisiere si directoare.

2. Privilegii de fisier

Privilegiile asociate unui fisier (sau director) determina operatiile pe care utilizatorii le pot efectua cu fisierul (sau directorul) respectiv. =
Privilegiile sunt date sub forma a trei grupuri alcatuite din câte trei caractere fiecare; cu alte cuvinte, trei triade. Prima triada indica privilegiile acordate posesorului fisierului. Cea de-a doua triada indica privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a treia triada indica privilegiile acordate altor utilizatori.
Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele UNIX, prin urmatoarele tri litere: 'r', 'w' si 'x'; acestea reprezinta:

  • r - fisierul poate fi citit
    w - se poate scrie în fisier
    x - continutul fisierului poate fi executat
Caracterele unei triade apar întotdeauna în secventa 'rwx'. Daca o anumita litera este înlocuita de o cratima (-), privilegiul asociat nu este accesibil.
De exemplu, sa examinam privilegiile specificate in urmatorul exemplu:
  • rwxr-xr--
Aceste caractere au urmatoarea semnificatie:
  • "rwx", posesorul fisierului poate citi, scrie sau executa fisierul
  • "r-x", membrii grupului posesor al fisierului pot citi sau executa fisierul, dar nu pot scrie în fisier
  • "r--", alti utilizatori pot citi fisierul, dar nu pot scrie în fisier sau executa continutul fisierului

Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil, cum sunt fisierele binare executabile (.exe) sau anumite categorii de scripturi.

Posesorul unui fisier poate modifica privilegiile asociate fisierului emitând comanda chmod (aceasta functioneaza in sistemele de operare UNIX).
Aceasta comanda are doua forme. O forma va permite sa specificati privilegiile folosind cifre scrise în octal; cealalta va permite sa le specificati folosind litere.
Pentru a specifica privilegiile folosind cifre în octal, calculati valoarea numerica a fiecarei triade. Pentru aceasta, însumati numerele corespunzatoare fiecarui privilegiu disponibil din cadrul triadei. Numerele asociate privilegiilor sunt urmatoarele:

  • r - 4
    w - 2
    x - 1
De exemplu, privilegiul "rwx" are valoarea 4 + 2 + 1 = 7. Similar, privilegiul "r-x" are valoarea 4 + l = 5, iar privilegiul "r--" are valoarea 4.
Dupa ce ati calculat valoarea numerica a fiecarei triade, formati un numar din trei cifre scris în octal, care este alcatuit din valoarea numerica a privilegiilor utilizatorilor, valoarea numerica a privilegiilor membrilor grupului, si valoarea numerica a privilegiilor altor utilizatori. Astfel, privilegiile "rwxr-xr--" corespund valorii în octal 754.

3. Modificarea privilegiilor unui fisier

Pentru a modifica privilegiile unui fisier, folositi functia chmod(), care are urmatoarea forma:

  • chmod(nume_fisier, mod)
Argumentul 'nume_fisier' specifica numele si calea de acces a fisierului ale carui privilegii urmeaza a fi modificate, iar argumentul 'mod' specifica privilegiile dorite, în general, se prefera exprimarea privilegiilor sub forma unui numar scris în octal. Pentru aceasta, prefixati valoarea folosind cifra 0.
De exemplu, puteti atribui unui fisier "text.txt" privilegiile "rwxr-xr--" specificând pentru 'mod' valoarea 0754, functia "chmod" va fi chmod("text.txt", 0754)
Pentru ca functia chmod() sa se execute cu succes, PHP trebuie sa ruleze sub contul utilizatorului posesor al fisierului. Functia returneaza TRUE în caz de reusita, respectiv FALSE în caz contrar.
Pentru a modifica grupul posesor al unui fisier, invocari functia chgrp(), care are forma:
  • chgrp("nume_fifier", grup)
- Unde "grup" este un nume sau numar care desemneaza grupul respectiv.

Functiile chmod() si chgrp() nu functioneaza sub Microsoft Windows.

4. Deschiderea unui fisier

Inainte de a putea citi sau scrie într-un fisier, trebuie sa deschideti fisierul folosind functia fopen().

  • fopen("nume_fisier", "mod")
- unde 'nume_fisier' specifica numele si calea spre fisierul care urmeaza a fi deschis, iar 'mod' indica tipul de acces dorit.
Modurile de deschidere a unui fisier sunt urmatoarele:
  • r - Permite doar citirea fisierului
    r+ - Citire sau scriere de la inceputul fisierului
    w - Creaza fisierul daca nu exista si suprascrie datele existente
    w+ - Citire sau scriere; la scriere , creeaza fisierul daca nu exista si suprascrie datele existente
    a - Adaugare; Creaza fisierul daca nu exista si adauga datele noi la sfarsitul fisierului existent
    a+ - Citire sau scriere; la scriere, creaza fisierul daca nu exista si adauga datele noi la sfarsitul fisierului existent
    x - Doar scriere; Creaza fisierul daca nu exista si genereaza un averisment daca acesta exista
    x+ - Citire sau scriere; Creaza fisierul daca nu exista si genereaza un averisment daca acesta exista
    b - Deschide fisierul in mod binar
Functia fopen() returneaza FALSE daca PHP nu a reusit sa deschida fisierul, în caz contrar, returneaza o valoare care contine un întreg, numit "identificator de fisier", care se foloseste pentru identificarea unui fisier de catre functiile care executa operatii cu fisiere.
De exemplu, instructiunea urmatoare deschide fisierul 'carte.txt' pentru citire:
  • $fh = fopen("carte.txt", "r");
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate în mod diferit. Când deschideti un fisier binar sub Windows, specificati "b" ca al doilea caracter al modului; de exemplu, "rb" pentru citire, "wb" pentru scriere, "a+b" pentru citire si adaugare. Daca nu procedati astfel, citirile din fisier si alte operatii se vor încheia prematur sau vor esua.

5. Verificarea finalizarii unei operatii cu un fisier

Operatiile cu fisiere (inclusiv cele legate de deschiderea, citirea unui fisier si scrierea într-un fisier) pot esua dintr-o varietate de motive. Deci, este important sa verificati daca fiecare operatie s-a încheiat cu succes.
Iata o modalitate în care puteti proceda:

<?php
$fh = fopen("carte.txt", "rb");
if (!$fh) {
      echo "Nu a fost deschis fisierul carte.txt.";
}
?>
Functia fopen() returneaza FALSE daca nu reuseste sa deschida fisierul. In acest caz, scriptul executa instructiunea echo care afisaza un mesaj.
O forma alternativa mai simpla foloseste operatorul OR (SAU):
<?php
($fh = fopen("carte.txt", "rb"))
      OR die("Nu a fost deschis fisierul carte.txt.");
?>

6. Inchiderea unui fisier

Un fisier deschis consuma resursele sistemului. Când un script a terminat de utilizat un fisier, scriptul trebuie sa închida fisierul, eliberând aceste resurse.
La sfârsitul unui script, PHP închide în mod automat fisierele deschise. Totusi, la programare se recomanda sa închideti fisierele mai rapid, ori de câte ori este posibil.
Pentru a închide un fisier, folositi functia fclose():

  • fclose(identificator_fisier)
- 'identificator_fisier' este identificatorul fisierului, returnat la deschiderea acestuia cu functia fopen()
Iata un exemplu caracteristic de deschidere, utilizare si închidere a unui fisier:
<?php
$fh = fopen("carte.txt", "rb");
if (!$fh) {
      echo "Nu a fost deschis fisierul carte.txt.";
}
// Aici se insereaza instructiunile care folosesc fisierul deschis
fclose($fh);
?>

Functia fclose() returneaza valoarea TRUE daca fisierul a fost închis cu succes. Testarea acestei valori este rareori necesara, deoarece nu se mai pot face prea multe dupa ce s-a ratat o încercare de a închide un fisier.