Acasă / Console de jocuri / Php obține ultimul fișier adăugat în subfoldere. Obținerea unei liste de fișiere și directoare folosind PHP. Utilizarea iteratoarelor SPL

Php obține ultimul fișier adăugat în subfoldere. Obținerea unei liste de fișiere și directoare folosind PHP. Utilizarea iteratoarelor SPL

În această lecție ne vom ocupa de o sarcină tipică care apare în timpul lucrului la un proiect PHP: obținerea unei liste de fișiere și directoare. Vom discuta mai multe abordări de bază și mai sofisticate, enumerând avantajele și dezavantajele fiecăreia. Primele trei soluții vor folosi funcții PHP standard, iar apoi vom prezenta una mai robustă folosind iteratoare SPL.

În scopul discuției de fond a soluției și demonstrațiilor, vom presupune că structura directorului este următoarea:

\---manager | \---utilizator | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Soluții de bază

Primul set de soluții se bazează pe utilizarea funcției glob(), o combinație a funcțiilor opendir() , readdir() și closedir() și, de asemenea, a funcției scandir().

Folosind glob()

Prima soluție se bazează pe utilizarea funcției glob(), care vă permite să căutați căi folosind modele. Funcția are doi parametri:

  • $pattern (obligatoriu): model de căutare
  • $flags (opțional): unul sau mai multe steaguri ale căror descrieri pot fi găsite în documentație

Să ne uităm la exemple. Pentru a căuta într-un director toate fișierele și directoarele ale căror nume se termină cu .TXT, ar trebui să utilizați codul:

Dacă afișăm variabila $filelist, obținem:

Matrice (0 => "article.txt", 1 => "text.txt")

Dacă aveți nevoie de o listă de fișiere și directoare ale căror nume încep cu „te”, atunci codul va arăta astfel:

Și rezultatul arată astfel:

Matrice (0 => "test.dat", 1 => "text.txt")

Și pentru a obține o listă cu numai directoare cu nume care conțin „ma”, utilizați codul:

Ultimul exemplu va scoate:

Matrice (0 => „manager”)

Rețineți că ultimul exemplu utilizează indicatorul GLOB_ONLYDIR ca al doilea parametru al funcției. Prin urmare, fișierul master.dat este exclus din listă. Deși funcția glob() este foarte ușor de utilizat, uneori nu este suficient de flexibilă. De exemplu, nu există niciun semnal pentru a obține numai fișiere (fără directoare) care se potrivesc cu modelul.

Folosim opendir() , readdir() și closedir() .

A doua abordare pentru obținerea unei liste de fișiere și directoare pe care le vom discuta este utilizarea funcțiilor opendir() , readdir() și closedir().

Funcția opendir() deschide un director și returnează un handle de conexiune. Odată obținut handle-ul, funcția readdir() poate fi utilizată. La fiecare apel, această funcție returnează numele următorului fișier sau director din directorul deschis. Dacă toate numele au fost deja listate, funcția revine fals. Funcția closedir() este folosită pentru a închide mânerul.

Spre deosebire de utilizarea funcției glob(), această abordare este mai complexă deoarece nu aveți parametri care să vă ajute la filtrarea listei de nume de fișiere și directoare returnate. Trebuie să faceți singur filtrarea pentru a obține rezultatele dorite.

Următorul exemplu returnează o listă de nume de fișiere și directoare care încep cu „te”:

Când rulați codul de mai sus, variabila $entry va conține incluziuni precum „.” Și „...”. Acestea sunt două directoare virtuale care există în fiecare director sistem de fișiere. Ele reprezintă directorul curent și, respectiv, directorul părinte.

Al doilea exemplu afișează numai fișierele conținute în directorul dat.

Exemplul va produce următoarele:

Matrice (0 => "article.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "text.txt")

Folosind scandir()

În cele din urmă, să introducem funcția scandir(). Are un singur parametru necesar: calea de citire. Funcția returnează o matrice de fișiere și directoare situate la calea specificată. Pentru a obține o listă de fișiere și directoare pe baza unui criteriu specific, trebuie să efectuați o filtrare suplimentară. Pe de altă parte, soluția este mai concisă și nu necesită gestionarea mânerului.

Acest exemplu arată cum să obțineți o listă de fișiere și directoare ale căror nume încep cu „te”:

Să folosim iteratoarele SPL

Acum să ne uităm la utilizarea iteratoarelor SPL. Dar înainte de a începe să ne rezolvăm problema, să facem o introducere în biblioteca SPL și iteratoare. Biblioteca SPL oferă o serie de clase pentru structuri de date orientate pe obiecte, iteratoare, descriptori de fișiere și multe altele.

Unul dintre avantajele iteratoarelor este că sunt clase și pot fi extinse pentru a se potrivi propriilor nevoi. Un alt avantaj este că iteratoarele au propriile lor metode, care sunt utile pentru rezolvarea multor probleme comune și sunt amplasate într-un singur loc. Uitați-vă la un exemplu de utilizare a FilesystemIterator versus readdir() . Ambele metode folosesc o buclă, dar cu readdir() procesați doar un șir, în timp ce FilesystemIterator lucrează cu un obiect care poate conține informații suplimentare despre fișier sau director (dimensiune, proprietar, permisiuni și așa mai departe).

Desigur, PHP oferă posibilitatea de a obține astfel de informații folosind funcții precum filesize() și fileowner(). Dar PHP5 se bazează pe utilizarea conceptului OOP. Prin urmare, este mai bine să utilizați metode moderne lucrul cu un limbaj de programare. Există lecții despre lucrul cu iteratorii pe site-ul nostru.

După cum sa menționat deja în partea apoasă a tutorialului, ne vom uita la utilizarea FilesystemIterator, RecursiveDirectoryIterator și GlobIterator. Primul moștenește de la DirectoryIterator, iar restul de la FilesystemIterator. Toate au același constructor, care ia doi parametri:

  • $cale (obligatoriu): calea către intrarea sistemului de fișiere pe care sunt efectuate operațiunile
  • $flags (opțional): unul sau mai multe steaguri listate în documentație

Diferența reală dintre aceste iteratoare este modul în care sunt utilizate pentru a naviga pe o anumită cale.

Sistem de fișiere Iterator

Utilizarea FilesystemIterator este foarte simplă. Să-l vedem în acțiune. Vă prezentăm două exemple. Primul arată o căutare pentru toate fișierele și directoarele ale căror nume încep cu „te”. Al doilea exemplu folosește un alt RegexIterator pentru a găsi toate fișierele și directoarele ale căror nume se termină cu „t.dat” sau „t.php”. RegexIterator este folosit pentru a filtra rezultatul pe baza expresiilor regulate.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

Codul de mai sus va produce un rezultat similar cu exemplele anterioare.

Al doilea exemplu folosind RegexIterator:

getFilename(); )

Va scoate:

Matrice (0 => "script.php", 1 => "test.dat")

RecursiveDirectoryIterator

RecursiveDirectoryIterator oferă o interfață pentru parcurgerea recursiv a directoarelor sistemului de fișiere. Are mai multe metode utile, cum ar fi getChildren() și hasChildren(), care returnează un iterator pentru locația curentă dacă este un director și verifică dacă punctul de intrare curent este un director. Următorul exemplu demonstrează utilizarea RecursiveDirectoryIterator și getChildren() . Rezultatul va fi același ca în exemplele anterioare.

getChildren(), "/t\.(php|dat)$/"); $filelist = array(); foreach($filtru ca $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator iterează prin sistemul de fișiere în același mod ca și funcția glob(). Primul parametru poate include un model pentru nume. Exemplul demonstrează utilizarea GlobIterator cu același rezultat ca înainte.

getFilename(); )

Concluzie

Această lecție demonstrează utilizarea diferitelor abordări pentru a atinge același obiectiv: obținerea unei liste de fișiere și directoare. Trebuie reținute următoarele puncte cheie:

  • Funcția glob() este o soluție încorporată, dar nu este suficient de flexibilă.
  • O soluție bazată pe opendir() , readdir() și closedir() este mai complexă și necesită filtrare suplimentară, dar este mai flexibilă.
  • Funcția scandir() necesită filtrare suplimentară, dar funcționează fără a procesa mânerul.
  • Dacă utilizați o abordare OOP, atunci ar trebui să utilizați biblioteca SPL. În plus, puteți extinde cursurile cu propriile dvs. funcționalități.
  • GlobIterator are o funcție de pre-filtrare, în timp ce alții folosesc RegexIterator.

Reg.ru: domenii și găzduire

Cel mai mare furnizor de înregistrare și găzduire din Rusia.

Peste 2 milioane de nume de domenii în serviciu.

Promovare, corespondență de domeniu, soluții de afaceri.

Peste 700 de mii de clienți din întreaga lume și-au făcut deja alegerea.

* Treceți mouse-ul peste pentru a întrerupe derularea.

Înapoi Înainte

Obținerea unei liste de foldere folosind PHP

Listarea directoarelor folosind PHP sau listarea directoarelor

Vom numi directory listing o interogare generală care generează o listă a tuturor sau a unora dintre fișierele și directoarele directorului părinte - un proces similar cu munca paginii de index furnizate de majoritatea serverelor web, dar cu O control mai mare asupra conținutului și formatării acestuia.

Un alt avantaj al acestui script este capacitatea de a efectua anumite acțiuni cu fișiere folosind PHP. În orice caz, primul pas pe care trebuie să-l facem este să interogăm sistemul de fișiere - returnați o listă de fișiere și directoare.

Funcțiile prezentate mai jos vă permit să extrageți nume de fișiere și alte proprietăți dintr-un anumit director sau să repetați recursiv prin subcategorii.

Comentariu: PHP5 are o funcție scandir, care „returnează o listă de fișiere și directoare din interiorul unui director la o cale dată”, dar nu afișează informații suplimentare despre fișierele din director.

Listarea unui director

Pentru început, iată un exemplu de funcție simplă care returnează o listă de fișiere, directoare și proprietățile acestora dintr-un singur director (veți găsi versiuni mai avansate ale acestei funcții puțin mai târziu în această lecție.)

read())) ( // omite fișierele ascunse dacă ($entry == ".") continuă; if(is_dir ("$dir$entry")) ( $retval = array ("nume" => "$dir$") entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_redable("$dir$entry")) ($retval = array("nume" = > "$dir$entry", "size" => file size("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval;

) ?>

Puteți utiliza această funcție ca mai jos:

Valoarea returnată este o matrice asociativă de fișiere, inclusiv informații despre calea fișierului, dimensiunea și data ultimei modificări, cu excepția cazului în care fișierul este un director, caz în care șirul „(dir)” apare în loc de dimensiunea fișierului. Exemplul 1:

",print_r($dirlist),"

Valoarea returnată este o matrice asociativă de fișiere, inclusiv informații despre calea fișierului, dimensiunea și data ultimei modificări, cu excepția cazului în care fișierul este un director, caz în care șirul „(dir)” apare în loc de dimensiunea fișierului."; /* exemplu de ieșire Array ( => Array ( => images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Exemplul 2:

"; /* exemplu de ieșire Array ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Listarea fișierelor prin HTML Pentru a obține rezultatele de ieșire pe pagină în HTML, vom parcurge matricea returnată\n"; ecou "NumeTip Dimensiune Listarea fișierelor prin HTML Ultimul mod. Listarea fișierelor prin HTML \n"; foreach($dirlist ca $fișier) ( echo " Listarea fișierelor prin HTML ($fișier[„nume”]) Listarea fișierelor prin HTML Listarea fișierelor prin HTML($fișier[„tip”])($fișier[„dimensiune”])

\n"; ) echo "

  • \n\n"; ?>
  • Acest cod este destul de ușor de modificat, de exemplu:
  • - afișați rezultatele listării ca o listă în loc de un tabel;
  • - faceți nume de fișiere link-uri active;

- înlocuiți numele cu pictograme în funcție de tipul de fișier;

Listarea fișierelor prin HTML Pentru a obține rezultatele de ieșire pe pagină în HTML, vom parcurge matricea returnată\n"; ecou "NumeTip etc. Listarea fișierelor prin HTML Ultimul mod. Listarea fișierelor prin HTML \n"; foreach($dirlist ca $fișier) ( echo " Listarea fișierelor prin HTML ($fișier[„nume”]) Listarea fișierelor prin HTML De exemplu, pentru a scoate numai fișiere PNG, adăugați o condiție simplă buclei de ieșire: Listarea fișierelor prin HTML($fișier[„tip”])($fișier[„dimensiune”])

\n"; foreach($dirlist ca $fișier) ( //verificați dacă fișierul este PNG dacă(!preg_match("/\.png$/", $fișier["nume"])) continuă; echo " „,data(„r”, $fișier[„lastmod”]),”. De asemenea, puteți aplica condiții suplimentare în funcție de tipul fișierului, dimensiunea sau data la care a fost modificată ultima dată.

Dacă, de exemplu, doriți să afișați o miniatură, un link către o imagine mai mare sau chiar un videoclip, nu trebuie decât să dați acestor 2 fișiere aceleași nume și, în scriptul de mai sus, utilizați str_replace sau o funcție similară pentru a modifica conținutul link-urilor.

Listarea directoarelor recursive

Și, din moment ce am ajuns până aici, vor exista doar modificări minore ale funcției de apelare a listei recursive și a subcategoriei. Adăugând un al doilea parametru la funcție, păstrăm funcționalitatea anterioară de a enumera un singur director.

read())) ( // omite fișierele ascunse dacă ($entry == ".") continuă; if(is_dir ("$dir$entry")) ( $retval = array ("nume" => "$dir$") entry/", "size" => 0, "lastmod" => filemtime ("$dir$entry")); if($recurse && is_redable("$dir$entry/")) ( $retval = array_merge($ retval, getFileList("$dir$entry/", true) ) elseif(este_citit("$dir$entry")) ( $retval = array("nume" => "$dir$intrare", "dimensiune" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) $d->close();

return $retval; ) ?> Pentru ca noua funcționalitate să funcționeze, trebuie să introduceți o valoare

adevărat

(sau 1) ca al doilea parametru.

Înainte de a recurge la script, verificați dacă subdirectoarele sunt lizibile și citiți și ultimul paragraf al acestei lecții pentru a evita erorile de acces.

Ca și înainte, valoarea returnată este un tablou, un tablou asociativ. De fapt, singura adăugare este o altă opțiune suplimentară pentru listarea recursivă.

read())) ( // omite fișierele ascunse dacă ($entry == ".") continuă; if(is_dir ("$dir$entry")) ( $retval = array ("nume" => "$dir$") intrare/", "dimensiune" => 0, "lastmod" => oră fișier ("$dir$entry")); if($recurse && is_redable("$dir$entry/")) ( if($adâncime == = fals) ( $retval = array_merge($retval, getFileList("$dir$entry/", true)); ) elseif($depth > 0) ( $retval = array_merge($retval, getFileList("$dir$entry) /", adevărat, $adâncime-1)); ) ) ) elseif(is_redable("$dir$entry")) ( $retval = array("nume" => "$dir$intrare", "dimensiune" => file size("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval; ) ?> Ca și înainte, am adăugat doar 1 fals parametru nou

și câteva linii de cod. Dacă nu este specificată valoarea implicită responsabilă pentru adâncimea recursiunii, atunci este setată la

. Acest lucru ne permite să fim siguri că funcțiile anterioare rămân și codul ulterior nu se va „rupe” atunci când funcția se schimbă.

Lucrul cu fișiere

Necesitatea operațiunilor cu fișiere se confruntă foarte des cu programatorul. Dacă scripturile dvs. nu folosesc baze de date, atunci fișierele sunt singurele dispozitive de stocare acceptabile pentru script. Utilizarea fișierelor ca depozite de informații de execuție a scripturilor le permite să fie utilizate într-o mare varietate de situații. Aproape toate scripturile de contor sunt scrise pe baza lucrului cu fișiere. De asemenea, este posibil să dați o grămadă de alte exemple, dar este timpul să treceți direct de la cuvinte la acțiune.

Vreau să spun imediat că lucrul cu fișierul trebuie să fie autorizat. În mod implicit, PHP nu permite manipularea fișierelor din motive de securitate. Pentru a elimina această interdicție în managerul FTP CuteFTP, bifați toate casetele din proprietățile fișierului, ceilalți manageri ar trebui să aibă ceva similar. fișier_existăÎnainte de a efectua operații pe un fișier, de multe ori trebuie să vă asigurați că fișierul specificat există chiar și. Aceasta este ceea ce face funcția file_exists. Această funcție poate returna doar două valori, așa cum vă puteți imagina ADEVĂRAT(dacă fișierul specificat există) și

FALS

. De obicei, utilizarea acestei funcții arată astfel:

Vă rugăm să rețineți că funcția funcționează numai pe fișierele locale, adică dacă doriți să verificați dacă Yandex a achiziționat un fișier robot.txt, atunci eforturile dumneavoastră vor fi în zadar. Dar este posibil să verificați orice fișier aflat pe serverul local, indiferent de directorul locației acestuia.

După cum sugerează și numele, funcția determină dimensiunea fișierului și o returnează în octeți. Util dacă doriți să verificați un fișier pentru a vedea dacă acesta conține informații (după cum vă puteți imagina, un fișier gol conține 0 octeți) și este, de asemenea, posibil să verificați dimensiunea fișierului pentru a vedea dacă depășește o anumită limită.

fişier

Această funcție funcționează deja direct cu fișierul. Returnează conținutul fișierului specificat și face acest lucru sub forma unui tablou, unde fiecare element este o linie a fișierului. Funcția este utilă atunci când trebuie să stocați mai multe valori diferite într-un fișier care nu ar trebui să se intersecteze. Apoi fiecare valoare este stocată pe o linie separată și citită de funcția fișier, care returnează o matrice, astfel încât variabila dată este accesată prin citirea valorii elementului de matrice cu indexul corespunzător liniei din fișier.

De asemenea, este posibil să reuniți toate elementele matricei returnate într-o singură variabilă. Acest lucru se face folosind funcția de matrice implode.

fopen

Dacă funcția anterioară este autonomă și, în general, nu are legătură cu alte funcții, atunci funcțiile ulterioare pentru lucrul cu fișiere funcționează împreună cu fopen . Această funcție deschide fișierul specificat și returnează identificatorul de conexiune la fișier, care este utilizat în scopuri de service. Această funcție nu este în niciun fel asociată cu conținutul fișierului.

Funcția fopen are mai multe moduri de lucru cu un fișier. Acestea sunt indicate după numele fișierului și sunt după cum urmează:

    "r"
    Fișierul este deschis numai pentru citirea conținutului său.

    "r+"
    Deschiderea unui fișier atât pentru citire, cât și pentru scriere.

    "w"
    Fișierul este deschis pentru scriere.

    "w+"
    Deschideți fișierul pentru citire și scriere.

    "o"
    Fișierul este deschis pentru scriere până la sfârșitul fișierului (adăugați).

    "a+"
    Se deschide pentru scriere și citire ulterioară.

fgets

Funcție pentru citirea unui fișier deschis de funcția fopen. Dar, spre deosebire de fișier, această funcție returnează doar o linie a fișierului de fiecare dată când este executată și mută pointerul fișierului intern la linia următoare, pe care o va citi data viitoare când funcția este apelată. Prin urmare, dacă trebuie să citiți întregul fișier, trebuie să utilizați această funcție într-o buclă.

Rețineți că funcția fgets utilizează un parametru suplimentar de lungime, care specifică lungimea maximă a unei linii de fișier de citit. Dacă dimensiunea șirului depășește acest număr, atunci funcția îl va returna într-o formă „trunchiată” de octeți de lungime. În mod implicit, acest parametru este setat la 1024 de octeți sau un kilooctet. Acordați atenție acestui parametru în special dacă utilizați fișiere mari, deoarece atunci când citiți astfel de fișiere, bufferul de execuție PHP se poate depăși (dimensiunea acestuia este indicată în fișierul de configurare), ceea ce va duce la înghețare.

Rețineți că fișierul de citit nu este numele fișierului, ci identificatorul conexiunii fișierului returnat de funcția fopen (în exemplul nostru, valoarea variabilei $file).

fputs

Funcția de scriere a informațiilor într-un fișier și face acest lucru conform principiului de funcționare al funcției fgets, adică începe scrierea din poziția pointerului intern al fișierului. În general, această funcție este în multe privințe similară cu cea de mai sus: folosește și parametrul de lungime a datelor de scriere, care este, de asemenea, opțional.

fclose

După cum probabil ați ghicit, această funcție închide fișierul specificat. De fapt, după finalizarea scriptului, PHP în sine închide toate fișierele deschise, dar este mai bine să faceți acest lucru manual. Ca parametru al funcției, trebuie să specificați identificatorul conexiunii fișierului.

Pentru a ilustra combinația funcțiilor de mai sus, vom da un exemplu de creare a unui simplu contor de vizite.

$fisier = fopen("counter.txt", "r");
$c = fgets($fișier, 150);
fclose($fișier);
$c++;
$fisier = fopen("counter.txt", "w");
fputs($fișier, $c);
fclose($fișier);
eco $c;
?>

Lucrul cu directoare

Strâns legate de acțiunile pe fișiere sunt operațiunile pe directoare. Algoritmul de lucru cu ele este similar cu operațiunile pe fișiere: mai întâi trebuie să deschideți directorul, să efectuați unele acțiuni și, în cele din urmă, să îl închideți.

opendir

Această funcție deschide directorul specificat și returnează identificatorul de serviciu pentru conexiunea directorului. Căile de director trebuie specificate după cum urmează:

Punctul înseamnă deschiderea directorului curent

. /fișiere/

Deschiderea unui folder fișiere situat în directorul curent

Deschiderea unui folder cu un nivel mai înalt decât cel actual

readdir

Funcția citește directorul deschis de opendir. Pentru fiecare trecere, returnează numele fișierului sau folderului situat în directorul specificat și mută pointerul intern la următorul obiect director. Deci, pentru a citi întregul director, acesta trebuie folosit într-o buclă.

De asemenea, trebuie remarcat faptul că această funcție returnează obiecte de serviciu folder . Şi .. , care poate fi tăiat atunci când este scos de instrucțiunea IF.

closedir

Închidem directorul, specificând ca argument identificatorul conexiunii la folder.

Uneori, folosirea funcțiilor de director face viața mult mai ușoară. De exemplu, în secțiunea Caracteristici, puteți vedea o listă de caracteristici în ordine alfabetică. Vă puteți imagina cât timp ar dura să scrieți manual această listă completă cu linkuri și chiar în ordine alfabetică. Și aici m-au ajutat funcțiile de lucru cu directoare. Fiecare funcție a fost plasată într-un fișier separat cu un nume corespunzător numelui funcției, fără extensii.

Deci, de fiecare dată când accesați pagina, obțineți o listă nou generată de funcții.

Asta e tot. Ne vedem la următoarea lecție.

Listarea directoarelor este procesul de obținere a informațiilor despre directoare și fișiere pentru un anumit director părinte, precum și capacitatea de a aplica diferite filtre acestor date pentru a corecta rezultatul.

În acest exemplu, vom încerca să facem față unei sarcini tipice care apare în aproape fiecare PHP proiect - obținerea unei liste de directoare și/sau fișiere. Exemplul folosește mai multe abordări de bază și mai complexe, subliniind avantajele și dezavantajele fiecărei tehnici. Primele trei soluții folosesc funcții standard PHP. Cea mai recentă soluție mai fiabilă folosind iteratoare PHP SPL.


Pentru o reprezentare mai vizuală, folosim o structură de directoare care arată astfel:


\-Aplicație | \-Utilizator | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Soluții de bază
Primul set de exemple folosește funcții glob()și combinații de funcții opendir(), readdir(), closedir(), precum și funcția scandir().

Folosind glob()

Exemplu de utilizare funcții php glob(), care vă permite să căutați o cale folosind un model.
Funcţie glob( $pattern,$steaguri) operează cu două argumente:
  • $pattern(obligatoriu): șir de model de căutare
  • $steaguri
    • GLOB_MARK- Adaugă o bară oblică la fiecare director returnat.
    • GLOB_NOSORT- Returnează fișierele în forma în care sunt conținute în director (fără sortare). Dacă acest steag nu este specificat, atunci numele sunt sortate alfabetic.
    • GLOB_NOCHECK- Returnează un model de căutare dacă nu au fost găsite fișiere folosindu-l.
    • GLOB_NOESCAPE- Barele oblice inverse nu scapă meta caracterele.
    • GLOB_BRACE- Se extinde (a,b,c) pentru a se potrivi cu „a”, „b” sau „c”.
    • GLOB_ONLYDIR- Returnează numai directoarele care se potrivesc cu modelul.
    • GLOB_ERR- Se oprește la erori de citire (de exemplu, directoare fără permisiunea de citire), erorile implicite sunt ignorate.
Pentru a căuta într-un director toate fișierele și directoarele ale căror nume se termină în .txt, utilizați următorul cod:În rezultat obținem următorul rezultat: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Dacă trebuie să obțineți o listă de fișiere și directoare ale căror nume începe cu „te”:În rezultat obținem următorul rezultat: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Obținând numai directoare cu nume care conțin "er" în listă:În rezultat obținem următorul rezultat: array(1) ( => string(4) "User" )

Ultimul exemplu folosește steagul GLOB_ONLYDIR ca al doilea argument al funcției. Prin urmare, numai directorul „Utilizator” din nume, care conține „er”, a fost inclus în listă. Funcția glob() este foarte ușor de utilizat, dar uneori nu este suficient de flexibilă. Nu există niciun semnal pentru a obține doar fișiere (fără directoare) care se potrivesc cu modelul.

Folosind opendir(), readdir() și closedir().

Următoarea metodă pentru a obține o listă de fișiere și directoare este utilizarea funcțiilor PHP opendir(), readdir()Şi closedir().

Funcţie opendir() returnează un handle în directorul deschis. Odată ce mânerul este primit, puteți utiliza funcția readdir(). Când accesați un mâner, funcția readdir() afișează numele următorului fișier sau director. Dacă toate elementele conținute în descriptor au fost deja enumerate, funcția readdir() va reveni fals. Pentru a închide descriptorul folosim funcția closedir().


Spre deosebire de utilizarea funcției php , această abordare este puțin mai complicată. Nu este posibil să setați parametrii de filtrare care ajută la generarea în avans a unei liste de nume de fișiere și directoare returnate. Pentru a obține lista necesară de fișiere și directoare, filtrarea trebuie efectuată independent.


Următorul exemplu returnează o listă de nume de fișiere și directoare care încep cu „Noi”:Rezultatul va fi: array(1) ( => string(4) "Utilizator" ) Următorul exemplu va scoate numai fișierele conținute în directorul dat.În rezultat obținem următorul rezultat: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) „serial.txt” => șir (10) „readme.txt” )

Folosind scandir().

Pentru a termina, să ne uităm la un exemplu de utilizare a unei funcții php scandir(). Are un singur atribut obligatoriu - calea către directorul de citire. Rezultatul funcției este o matrice de fișiere și directoare situate de-a lungul căii specificate în argument. Ca și în exemplul anterior, pentru a obține o listă filtrată de fișiere și directoare, trebuie să o rulați singur. Din punct de vedere vizual, soluția este mai scurtă și nu este necesară gestionarea descriptorilor.


Exemplul arată cum să obțineți o listă de fișiere și directoare ale căror nume încep cu „te”:În rezultat obținem următorul rezultat: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Soluție avansată folosind PHP SPL
Soluție mai fiabilă folosind iteratoare SPL Sistem de fișiere Iterator, RecursiveDirectoryIteratorŞi GlobIterator.

Folosind iteratoare SPL.

Să ne uităm la utilizarea iteratoarelor SPL. Înainte de a începe să rezolvăm problema, să ne familiarizăm puțin cu biblioteca PHP SPL și iteratoarele. Biblioteca SPL oferă seturi specializate de clase pentru structuri de date orientate pe obiecte, iteratoare, descriptori de fișiere și multe altele.


Principalul avantaj al iteratoarelor este că sunt clase și pot fi extinse folosind un mecanism standard moștenire php clasele. Un alt plus este că iteratoarele au propriile lor metode care pot fi utile pentru rezolvarea problemelor comune și toate sunt localizate într-un singur loc. Să ne uităm la un exemplu de utilizare Sistem de fișiere Iterator si compara cu readdir(). Ambele metode folosesc o buclă, dar în caz readdir() se va putea procesa doar șirul, dar Sistem de fișiere Iterator poate lucra cu un obiect. Care poate conține informații suplimentare despre fișier sau director, cum ar fi proprietarul, dimensiunea, drepturile de acces și așa mai departe.


Desigur, PHP are capacitatea de a obține aceste informații folosind funcții, dimensiunea fișierului (), proprietar de fișier() si altele. Dar PHP, ca orice limbaj de programare, are capacitatea de a se schimba. În PHP5 există o dorință tot mai mare de a utiliza concepte OOP. Prin urmare, este mai bine să folosiți metode moderne de lucru cu un limbaj de programare.


Luați în considerare utilizarea Sistem de fișiere Iterator, RecursiveDirectoryIteratorŞi GlobIterator. Primul iterator moștenește de la DirectoryIterator, iar restul de la Sistem de fișiere Iterator. Toate au același constructor, care ia două argumente:

  • $cale(obligatoriu): calea către elementul sistemului de fișiere pe care sunt efectuate operațiuni
  • $steaguri(opțional): unul sau mai multe steaguri
    • FilesystemIterator::CURRENT_AS_PATHNAME Determină metoda FilesystemIterator::current() să returneze o cale.
    • FilesystemIterator::CURRENT_AS_FILEINFO Determină metoda FilesystemIterator::current() să returneze o instanță a SplFileInfo.
    • FilesystemIterator::CURRENT_AS_SELF Determină metoda FilesystemIterator::current() să returneze $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Măști FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Determină metoda FilesystemIterator::key() să returneze o cale.
    • FilesystemIterator::KEY_AS_FILENAME Determină metoda FilesystemIterator::key() să returneze numele fișierului.
    • FilesystemIterator::FOLLOW_SYMLINKS Forțează metoda RecursiveDirectoryIterator::hasChildren() să urmeze legături simbolice.
    • FilesystemIterator::KEY_MODE_MASK Mask FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY La fel ca FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Omite fișierele cu puncte (. și ..).
    • FilesystemIterator::UNIX_PATHS Forțează toate căile să utilizeze bare oblice inverse în stil Unix, indiferent de setările implicite ale sistemului.

Diferența dintre aceste iteratoare este modul în care sunt utilizate pentru a naviga pe o anumită cale.

Sistem de fișiere Iterator

Utilizare Sistem de fișiere Iterator foarte simplu.
Exemplul arată o căutare pentru toate fișierele și directoarele ale căror nume încep cu „te”.

getFilename(),"te")===0): $arFileList = $obFile->getFilename();

endif; endforeach; //Ies rezultatul var_dump($arFileList); ?> În rezultat obținem următorul rezultat: array(2) ( => string(7) "test.js" => string(9) "test.html" ) Exemplu de utilizare a altui iterator RegexIterator Exemplu de utilizare a altui iterator pentru a căuta toate fișierele și directoarele ale căror nume se termină cu „t.js” sau „t.php”. Iterator

este folosit pentru a filtra rezultatul și folosește un motor de expresii regulate.

RecursiveDirectoryIterator

getFilename(); endforeach; //Afișează rezultatul var_dump($arFileList); ?> În rezultat obținem următorul rezultat: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIterator Iterator oferă o interfață pentru parcurgerea recursiv a directoarelor sistemului de fișiere. Are mai multe metode utile, cum ar fiŞi getChildren() areChildren()


RecursiveDirectoryIteratorŞi oferă o interfață pentru parcurgerea recursiv a directoarelor sistemului de fișiere. Are mai multe metode utile, cum ar fi. , care returnează un iterator pentru locația curentă dacă este un director și verifică dacă punctul de intrare curent este un director. getChildren(), "/t\.(txt|css)$/"); $arFileList = array(); foreach($rxIterator ca $obFile): $arFileList = $obFile->getFilename(); endforeach; //Afișează rezultatul var_dump($arFileList); ?> În rezultat obținem următorul rezultat:în acest caz,

GlobIterator

getFilename(); endforeach; //Afișează rezultatul var_dump($arFileList); ?> În rezultat obținem următorul rezultat: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobIterator efectuează o traversare a fișierelor similară cu . Primul atribut poate include un model de nume.


Exemplul demonstrează utilizarea GlobIterator cu același rezultat ca înainte.getFilename(); endforeach; //Ies rezultatul var_dump($arFileList); ?> În rezultat obținem următorul rezultat: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Concluzie

Au fost luate în considerare exemplele de mai sus diverse metode PHP pentru a atinge același obiectiv: obținerea unei liste de fișiere și directoare.

Următoarele puncte principale pot fi evidențiate din exemple: