PHP pronalazi sve datoteke u folderu. Scandir - preuzima listu datoteka i direktorija koji se nalaze na navedenoj putanji. Listing jednog direktorija

U ovoj lekciji bavićemo se tipičnim zadatkom koji se javlja tokom rada na PHP projektu: dobijanje liste datoteka i direktorijuma. Razgovarat ćemo o nekoliko osnovnih i sofisticiranijih pristupa, navodeći prednosti i nedostatke svakog od njih. Prva tri rješenja će koristiti standardne PHP funkcije, a zatim ćemo uvesti robusnije korištenjem SPL iteratora.

U svrhu suštinske rasprave o rješenju i demonstracija, pretpostavit ćemo da je struktura direktorija sljedeća:

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

Osnovna rješenja

Prvi set rješenja baziran je na korišćenju funkcije glob(), kombinaciji funkcija opendir(), readdir() i closeir(), kao i funkcije scandir().

Korištenje glob()

Prvo rješenje je bazirano na korišćenju funkcije glob() koja vam omogućava da pretražujete staze koristeći obrasce. Funkcija ima dva parametra:

  • $pattern (obavezno): obrazac pretraživanja
  • $flags (opciono): jedna ili više zastavica, čiji se opisi mogu naći u dokumentaciji

Pogledajmo primjere. Za pretraživanje direktorija za sve datoteke i direktorije čija imena završavaju sa .txt, trebali biste koristiti kod:

Ako prikažemo varijablu $filelist, dobijamo:

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

Ako vam je potrebna lista datoteka i direktorija čija imena počinju s "te", kod će izgledati ovako:

A izlaz izgleda ovako:

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

A da biste dobili listu samo direktorija s imenima koja sadrže "ma", koristite kod:

Posljednji primjer će ispisati:

Niz (0 => "menadžer")

Imajte na umu da posljednji primjer koristi oznaku GLOB_ONLYDIR kao drugi parametar funkcije. Stoga je datoteka master.dat isključena sa liste. Iako je funkcija glob() vrlo jednostavna za korištenje, ponekad nije dovoljno fleksibilna. Na primjer, ne postoji oznaka za dobivanje samo datoteka (bez direktorija) koji odgovaraju uzorku.

Koristimo opendir(), readdir() i closeir().

Drugi pristup za dobivanje liste datoteka i direktorija o kojem ćemo raspravljati je korištenje funkcija opendir(), readdir() i closeir().

Funkcija opendir() otvara direktorij i vraća ručku veze. Jednom kada se dobije ručka, funkcija readdir() se može koristiti. Uz svaki poziv, ova funkcija vraća ime sljedeće datoteke ili direktorija unutar otvorenog direktorija. Ako su sva imena već navedena, funkcija se vraća false. Closeir() funkcija se koristi za zatvaranje ručke.

Za razliku od upotrebe funkcije glob(), ovaj pristup je složeniji jer nemate parametre koji bi pomogli u filtriranju liste datoteka i imena direktorija koji se vraćaju. Morate sami izvršiti filtriranje da biste dobili rezultate koje želite.

Sljedeći primjer vraća listu imena datoteka i direktorija koja počinju s “te”:

Prilikom pokretanja gornjeg koda, varijabla $entry će sadržavati inkluzije kao što je "." I "..". Ovo su dva virtuelna direktorija koja postoje u svakom direktoriju sistema datoteka. Oni predstavljaju trenutni direktorij, odnosno nadređeni direktorij.

Drugi primjer prikazuje samo datoteke sadržane u datom direktoriju.

Primjer će proizvesti sljedeće:

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

Korištenje scandir()

Na kraju, hajde da predstavimo funkciju scandir(). Ima samo jedan potreban parametar: putanju čitanja. Funkcija vraća niz datoteka i direktorija koji se nalaze na navedenoj putanji. Da biste dobili listu datoteka i direktorija na osnovu određenog kriterija, potrebno je izvršiti dodatno filtriranje. S druge strane, rješenje je sažetije i ne zahtijeva upravljanje ručkom.

Ovaj primjer pokazuje kako dobiti listu datoteka i direktorija čija imena počinju s “te”:

Koristimo SPL iteratore

Pogledajmo sada korištenje SPL iteratora. Ali prije nego počnemo rješavati naš problem, hajde da damo uvod u SPL biblioteku i iteratore. SPL biblioteka pruža niz klasa za objektno orijentirane strukture podataka, iteratore, deskriptore datoteka i još mnogo toga.

Jedna od prednosti iteratora je da su to klase i da se mogu proširiti tako da odgovaraju vašim potrebama. Još jedna prednost je što iteratori imaju svoje metode, koje su korisne za rješavanje mnogih uobičajenih problema i nalaze se na jednom mjestu. Pogledajte primjer korištenja FilesystemIterator u odnosu na readdir() . Obje metode koriste petlju, ali sa readdir() obrađujete samo string, dok FilesystemIterator radi s objektom koji može sadržavati dodatne informacije o datoteci ili direktoriju (veličina, vlasnik, dozvole, itd.).

Naravno, PHP pruža mogućnost dobijanja takvih informacija pomoću funkcija kao što su filesize() i fileowner(). Ali PHP5 je zasnovan na korišćenju OOP koncepta. Stoga je bolje koristiti savremene metode rada sa programskim jezikom. Na našoj web stranici nalaze se lekcije o radu s iteratorima.

Kao što je već rečeno u vodenom dijelu tutorijala, pokriti ćemo upotrebu FilesystemIterator, RecursiveDirectoryIterator i GlobIterator. Prvi nasljeđuje od DirectoryIterator, a ostatak od FilesystemIterator. Svi imaju isti konstruktor, koji uzima dva parametra:

  • $path (obavezno): put do unosa sistema datoteka na kojem se izvode operacije
  • $flags (opciono): jedna ili više zastavica navedenih u dokumentaciji

Prava razlika u ovim iteratorima je način na koji se koriste za navigaciju datom putanjom.

FilesystemIterator

Korištenje FilesystemIterator-a je vrlo jednostavno. Pogledajmo to na djelu. Predstavljamo dva primjera. Prvi prikazuje pretragu svih datoteka i direktorija čija imena počinju sa “te”. Drugi primjer koristi drugi RegexIterator za pronalaženje svih datoteka i direktorija čija imena završavaju sa “t.dat” ili “t.php”. RegexIterator se koristi za filtriranje rezultata na osnovu regularnih izraza.

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

Gornji kod će dati rezultat sličan prethodnim primjerima.

Drugi primjer korištenja RegexIterator-a:

getFilename(); )

Izaći će:

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

RecursiveDirectoryIterator

RecursiveDirectoryIterator pruža sučelje za rekurzivno kretanje kroz direktorije sistema datoteka. Ima nekoliko korisnih metoda, kao što su getChildren() i hasChildren(), koje vraćaju iterator za trenutnu lokaciju ako je direktorij i provjeravaju da li je trenutna ulazna točka direktorij. Sljedeći primjer pokazuje upotrebu RecursiveDirectoryIterator i getChildren() . Rezultat će biti isti kao u prethodnim primjerima.

getChildren(), "/t\.(php|dat)$/"); $filelist = niz(); foreach($filter kao $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator iterira kroz sistem datoteka na isti način kao i funkcija glob(). Prvi parametar može uključivati ​​obrazac za ime. Primjer pokazuje upotrebu GlobIteratora sa istim rezultatom kao i prije.

getFilename(); )

Zaključak

Ova lekcija pokazuje upotrebu različitih pristupa za postizanje istog cilja: dobivanje liste datoteka i direktorija. Treba zapamtiti sljedeće ključne tačke:

  • Funkcija glob() je ugrađeno rješenje, ali nije dovoljno fleksibilna.
  • Rješenje zasnovano na opendir(), readdir() i closeir() je složenije i zahtijeva dodatno filtriranje, ali je fleksibilnije.
  • Funkcija scandir() zahtijeva dodatno filtriranje, ali radi bez obrade ručke.
  • Ako koristite OOP pristup, trebali biste koristiti SPL biblioteku. Osim toga, možete proširiti nastavu s vlastitom funkcionalnošću.
  • GlobIterator ima funkciju prethodnog filtriranja, dok drugi koriste RegexIterator.

scandir - Dobiva listu datoteka i direktorija koji se nalaze na navedenoj putanji

Opis

Niz scandir (string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resurs $context ]])

Povratak niz, koji sadrži nazive datoteka i direktorija koji se nalaze duž putanje proslijeđene u parametru direktorija.

Lista parametara

Katalog za skeniranje.

Sortiranje_red

Podrazumevano, sortiranje se vrši abecednim redom u rastućem redosledu. Ako je opcijski parametar sorting_order postavljen na SCANDIR_SORT_DESCENDING, sortiranje se vrši abecednim redom u silaznom redu. Ako je postavljeno na SCANDIR_SORT_NONE, tada se ne vrši sortiranje.

Kontekst

Za opis parametra konteksta, pogledajte odjeljak "Threads" u ovom priručniku.

Povratne vrijednosti

Povratak niz imena datoteka ako su uspješni ili FALSE u slučaju greške. Ako direktorij nije direktorij, vraća FALSE i generira se poruka o grešci nivoa E_UPOZORENJE.

Lista promjena

Primjeri

Primjer #1 Jednostavan primjer korištenja funkcije scandir()

$dir = "/tmp" ;
$files1 = scandir($dir);
$files2 = scandir($dir, 1);

Print_r($files1);
print_r($files2);
?>

Rezultat pokretanja ovog primjera bit će otprilike ovako:

Niz ( => . => .. => bar.php => foo.txt => somedir) Niz ( => somedir => foo.txt => bar.php => .. => .)

Primjer #2 Opcija alternativne funkcije scandir() za PHP 4

$dir = "/tmp" ;
$dh = opendir($dir);
while (false !== ($filename = readdir ($dh ))) (
$files = $filename;
}

Sortiraj($files);

Print_r($files);

Rsort($files);

Print_r($files);

Listanje direktorija je proces dobijanja informacija o direktorijumima i datotekama za dati roditeljski direktorij, kao i mogućnost primjene različitih filtera na ove podatke kako bi se ispravio izlaz.

U ovom primjeru pokušat ćemo se nositi s tipičnim zadatkom koji se pojavljuje u gotovo svakom PHP projekat - dobijanje liste direktorijuma i/ili fajlova. Primjer koristi nekoliko osnovnih i složenijih pristupa, naglašavajući prednosti i nedostatke svake tehnike. Prva tri rješenja koriste standardne PHP funkcije. Najnovije pouzdanije rješenje koje koristi PHP SPL iteratore.


Za vizualniji prikaz koristimo strukturu direktorija koja izgleda ovako:


\-Primjena | \-Korisnik | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Osnovna rješenja
Prvi skup primjera koristi funkcije glob() i kombinacije funkcija opendir(), readdir(), zatvoreno(), kao i funkcija scandir().

Korištenje glob()

Primjer korištenja php funkcije glob(), koji vam omogućava da tražite putanju koristeći obrazac.
Funkcija globus ( $pattern,$flags) radi sa dva argumenta:
  • $pattern(obavezno): niz uzoraka pretraživanja
  • $flags
    • GLOB_MARK- Dodaje kosu crtu svakom vraćenom direktoriju.
    • GLOB_NOSORT- Vraća datoteke u obliku u kojem su sadržane u direktoriju (bez sortiranja). Ako ova zastavica nije navedena, imena se sortiraju po abecednom redu.
    • GLOB_NOCHECK- Vraća obrazac pretraživanja ako nije pronađen nijedan fajl pomoću njega.
    • GLOB_NOESCAPE- Obrnute kose crte ne zaobilaze meta znakove.
    • GLOB_BRACE- Proširuje (a,b,c) da odgovara "a", "b" ili "c".
    • GLOB_ONLYDIR- Vraća samo direktorije koji odgovaraju uzorku.
    • GLOB_ERR- Zaustavlja se na greškama čitanja (na primjer, direktoriji bez dozvole čitanja), prema zadanim postavkama greške se zanemaruju.
Da biste pretražili direktorij za sve datoteke i direktorije čija imena završavaju na .txt, koristite sljedeći kod:U izlazu dobijamo sljedeći rezultat: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Ako trebate dobiti listu datoteka i direktorija čija imena počni sa "te":U izlazu dobijamo sljedeći rezultat: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Dobivanje samo direktorija s imenima koji sadrže "er" na listi:U izlazu dobijamo sljedeći rezultat: array(1) ( => string(4) "Korisnik")

Posljednji primjer koristi zastavu GLOB_ONLYDIR kao drugi argument funkcije. Stoga je samo direktorij “Korisnik” u nazivu koji sadrži “er” uključen u listu. Funkcija glob() je vrlo jednostavna za korištenje, ali ponekad nije dovoljno fleksibilna. Ne postoji oznaka za dobivanje samo datoteka (bez direktorija) koji odgovaraju uzorku.

Korištenje opendir(), readdir() i closeir().

Sljedeća metoda za dobivanje liste datoteka i direktorija je korištenje PHP funkcija opendir(), readdir() I zatvoreno().

Funkcija opendir() vraća ručku na otvoreni direktorij. Kada primite ručku, možete koristiti funkciju readdir(). Prilikom pristupa ručki, funkcija readdir() prikazuje naziv sljedeće datoteke ili direktorija. Ako su svi elementi sadržani u deskriptoru već nabrojani, funkcija readdir()će se vratiti false. Za zatvaranje deskriptora koristimo funkciju zatvoreno().


Za razliku od upotrebe php funkcije , ovaj pristup je malo komplikovaniji. Nije moguće postaviti parametre filtriranja koji pomažu u generiranju liste vraćenih imena datoteka i direktorija unaprijed. Da biste dobili potrebnu listu datoteka i direktorija, filtriranje se mora izvršiti nezavisno.


Sljedeći primjer vraća listu imena datoteka i direktorija koja počinju s "Mi":Izlaz će biti: array(1) ( => string(4) "Korisnik" ) Sljedeći primjer će prikazati samo datoteke sadržane u datom direktoriju.U izlazu dobijamo sljedeći rezultat: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => string(10) "readme.txt" )

Korištenje scandir().

Za kraj, pogledajmo primjer korištenja php funkcije scandir(). Ima samo jedan obavezni atribut - putanju do direktorija za čitanje. Rezultat funkcije je niz datoteka i direktorija smještenih duž putanje navedene u argumentu. Kao iu prethodnom primjeru, da biste dobili filtriranu listu datoteka i direktorija, morate to učiniti sami. Vizuelno, rješenje je kraće i nije potrebno upravljanje deskriptorima.


Primjer pokazuje kako dobiti listu datoteka i direktorija čija imena počinju s "te":U izlazu dobijamo sljedeći rezultat: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Napredno rješenje koristeći PHP SPL
Pouzdanije rješenje korištenjem SPL iteratora FilesystemIterator, RecursiveDirectoryIterator I GlobIterator.

Korištenje SPL iteratora.

Pogledajmo korištenje SPL iteratora. Pre nego što počnemo da rešavamo problem, hajde da se malo upoznamo sa PHP SPL bibliotekom i iteratorima. SPL biblioteka pruža specijalizovane skupove klasa za objektno orijentisane strukture podataka, iteratore, deskriptore datoteka i još mnogo toga.


Glavna prednost iteratora je da su klase i da se mogu proširiti pomoću standardnog PHP mehanizma nasljeđivanja klasa. Još jedan plus je što iteratori imaju svoje metode koje mogu biti korisne za rješavanje uobičajenih problema, a svi se nalaze na jednom mjestu. Pogledajmo primjer upotrebe FilesystemIterator i uporedi sa readdir(). Obje metode koriste petlju, ali u slučaju readdir() biće moguće obraditi samo string, ali FilesystemIterator može raditi sa objektom. Koji može sadržavati dodatne informacije o datoteci ili direktoriju kao što su vlasnik, veličina, prava pristupa i tako dalje.


Naravno, PHP ima mogućnost da dobije ove informacije koristeći funkcije, veličina datoteke(), vlasnik fajla() i drugi. Ali PHP, kao i svaki programski jezik, ima mogućnost promjene. U PHP5 postoji sve veća želja za korištenjem OOP koncepata. Stoga je bolje koristiti savremene metode rada sa programskim jezikom.


Razmislite o korištenju FilesystemIterator, RecursiveDirectoryIterator I GlobIterator. Prvi iterator je naslijeđen od DirectoryIterator, a ostalo od FilesystemIterator. Svi imaju isti konstruktor, koji uzima dva argumenta:

  • $path(obavezno): put do stavke sistema datoteka na kojoj se izvode operacije
  • $flags(opciono): jedna ili više zastavica
    • FilesystemIterator::CURRENT_AS_PATHNAME Uzrokuje metodu FilesystemIterator::current() da vrati putanju.
    • FilesystemIterator::CURRENT_AS_FILEINFO Uzrokuje metodu FilesystemIterator::current() da vrati instancu SplFileInfo.
    • FilesystemIterator::CURRENT_AS_SELF Uzrokuje metodu FilesystemIterator::current() da vrati $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Maske FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Uzrokuje metodu FilesystemIterator::key() da vrati putanju.
    • FilesystemIterator::KEY_AS_FILENAME Uzrokuje metodu FilesystemIterator::key() da vrati ime datoteke.
    • FilesystemIterator::FOLLOW_SYMLINKS Forsira metodu RecursiveDirectoryIterator::hasChildren() da prati simboličke veze.
    • FilesystemIterator::KEY_MODE_MASK Maske FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Isto kao FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Preskače datoteke sa tačkama (. i ..).
    • FilesystemIterator::UNIX_PATHS Prisiljava sve putanje da koriste obrnute kose crte u Unix stilu, bez obzira na zadane postavke sistema.

Razlika u ovim iteratorima je kako se koriste za navigaciju duž date putanje.

FilesystemIterator

Koristi FilesystemIterator vrlo jednostavno.
Primjer pokazuje pretragu svih datoteka i direktorija čija imena počinju s "te".

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

endif; endforeach; //Prikaži rezultat var_dump($arFileList); ?> U izlazu dobijamo sljedeći rezultat: array(2) ( => string(7) "test.js" => string(9) "test.html" ) Primjer korištenja drugog iteratora RegexIterator Primjer korištenja drugog iteratora za pretraživanje svih datoteka i direktorija čija imena završavaju sa "t.js" ili "t.php". Iterator

koristi se za filtriranje rezultata i koristi mehanizam regularnih izraza.

RecursiveDirectoryIterator

getFilename(); endforeach; //Prikaži rezultat var_dump($arFileList); ?> U izlazu dobijamo sljedeći rezultat: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIterator Iterator pruža interfejs za rekurzivno kretanje kroz direktorijume sistema datoteka. Ima nekoliko korisnih metoda kao npr I getChildren() imaChildren()


RecursiveDirectoryIterator I pruža interfejs za rekurzivno kretanje kroz direktorijume sistema datoteka. Ima nekoliko korisnih metoda kao npr. , koji vraćaju iterator za trenutnu lokaciju ako je direktorij i provjeravaju da li je trenutna ulazna točka direktorij.

GlobIterator

getFilename(); endforeach; //Prikaži rezultat var_dump($arFileList); ?> U izlazu dobijamo sljedeći rezultat: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobIterator getChildren(), "/t\.(txt|css)$/"); $arFileList = niz(); foreach($rxIterator kao $obFile): $arFileList = $obFile->getFilename(); endforeach; //Prikaži rezultat var_dump($arFileList); ?> U izlazu dobijamo sljedeći rezultat u ovom slučaju - ovo je datoteka iz direktorija "Korisnik": array(1) ( => string(8) "test.txt" )


obavlja obilazak fajla sličan . Prvi atribut može uključivati ​​obrazac imena. GlobIterator Primjer pokazuje upotrebusa istim rezultatom kao i ranije.

Zaključak

U gornjim primjerima se razmatraju različite PHP metode za postizanje istog cilja: dobivanje liste datoteka i direktorija.

Sljedeće glavne točke mogu se istaknuti iz primjera:

U ovoj lekciji bavićemo se tipičnim zadatkom koji se javlja tokom rada na PHP projektu: dobijanje liste datoteka i direktorijuma. Razgovarat ćemo o nekoliko osnovnih i sofisticiranijih pristupa, navodeći prednosti i nedostatke svakog od njih. Prva tri rješenja će koristiti standardne PHP funkcije, a zatim ćemo uvesti robusnije korištenjem SPL iteratora.

U svrhu suštinske rasprave o rješenju i demonstracija, pretpostavit ćemo da je struktura direktorija sljedeća:

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

Osnovna rješenja

Prvi set rješenja baziran je na korišćenju funkcije glob(), kombinaciji funkcija opendir(), readdir() i closeir(), kao i funkcije scandir().

Korištenje glob()

Prvo rješenje je bazirano na korišćenju funkcije glob() koja vam omogućava da pretražujete staze koristeći obrasce. Funkcija ima dva parametra:

  • $pattern (obavezno): obrazac pretraživanja
  • $flags (opciono): jedna ili više zastavica, čiji se opisi mogu naći u dokumentaciji

Pogledajmo primjere. Za pretraživanje direktorija za sve datoteke i direktorije čija imena završavaju sa .txt, trebali biste koristiti kod:

Ako prikažemo varijablu $filelist, dobijamo:

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

Ako vam je potrebna lista datoteka i direktorija čija imena počinju s "te", kod će izgledati ovako:

A izlaz izgleda ovako:

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

A da biste dobili listu samo direktorija s imenima koja sadrže "ma", koristite kod:

Posljednji primjer će ispisati:

Niz (0 => "menadžer")

Imajte na umu da posljednji primjer koristi oznaku GLOB_ONLYDIR kao drugi parametar funkcije. Stoga je datoteka master.dat isključena sa liste. Iako je funkcija glob() vrlo jednostavna za korištenje, ponekad nije dovoljno fleksibilna. Na primjer, ne postoji oznaka za dobivanje samo datoteka (bez direktorija) koji odgovaraju uzorku.

Koristimo opendir(), readdir() i closeir().

Drugi pristup za dobivanje liste datoteka i direktorija o kojem ćemo raspravljati je korištenje funkcija opendir(), readdir() i closeir().

Funkcija opendir() otvara direktorij i vraća ručku veze. Jednom kada se dobije ručka, funkcija readdir() se može koristiti. Uz svaki poziv, ova funkcija vraća ime sljedeće datoteke ili direktorija unutar otvorenog direktorija. Ako su sva imena već navedena, funkcija se vraća false. Closeir() funkcija se koristi za zatvaranje ručke.

Za razliku od upotrebe funkcije glob(), ovaj pristup je složeniji jer nemate parametre koji bi pomogli u filtriranju liste datoteka i imena direktorija koji se vraćaju. Morate sami izvršiti filtriranje da biste dobili rezultate koje želite.

Sljedeći primjer vraća listu imena datoteka i direktorija koja počinju s “te”:

Prilikom pokretanja gornjeg koda, varijabla $entry će sadržavati inkluzije kao što je "." I "..". Ovo su dva virtuelna direktorija koja postoje u svakom direktoriju sistema datoteka. Oni predstavljaju trenutni direktorij, odnosno nadređeni direktorij.

Drugi primjer prikazuje samo datoteke sadržane u datom direktoriju.

Primjer će proizvesti sljedeće:

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

Korištenje scandir()

Na kraju, hajde da predstavimo funkciju scandir(). Ima samo jedan potreban parametar: putanju čitanja. Funkcija vraća niz datoteka i direktorija koji se nalaze na navedenoj putanji. Da biste dobili listu datoteka i direktorija na osnovu određenog kriterija, potrebno je izvršiti dodatno filtriranje. S druge strane, rješenje je sažetije i ne zahtijeva upravljanje ručkom.

Ovaj primjer pokazuje kako dobiti listu datoteka i direktorija čija imena počinju s “te”:

Koristimo SPL iteratore

Pogledajmo sada korištenje SPL iteratora. Ali prije nego počnemo rješavati naš problem, hajde da damo uvod u SPL biblioteku i iteratore. SPL biblioteka pruža niz klasa za objektno orijentirane strukture podataka, iteratore, deskriptore datoteka i još mnogo toga.

Jedna od prednosti iteratora je da su to klase i da se mogu proširiti tako da odgovaraju vašim potrebama. Još jedna prednost je što iteratori imaju svoje metode, koje su korisne za rješavanje mnogih uobičajenih problema i nalaze se na jednom mjestu. Pogledajte primjer korištenja FilesystemIterator u odnosu na readdir() . Obje metode koriste petlju, ali sa readdir() obrađujete samo string, dok FilesystemIterator radi s objektom koji može sadržavati dodatne informacije o datoteci ili direktoriju (veličina, vlasnik, dozvole, itd.).

Naravno, PHP pruža mogućnost dobijanja takvih informacija pomoću funkcija kao što su filesize() i fileowner(). Ali PHP5 je zasnovan na korišćenju OOP koncepta. Stoga je bolje koristiti savremene metode rada sa programskim jezikom. Na našoj web stranici nalaze se lekcije o radu s iteratorima.

Kao što je već rečeno u vodenom dijelu tutorijala, pokriti ćemo upotrebu FilesystemIterator, RecursiveDirectoryIterator i GlobIterator. Prvi nasljeđuje od DirectoryIterator, a ostatak od FilesystemIterator. Svi imaju isti konstruktor, koji uzima dva parametra:

  • $path (obavezno): put do unosa sistema datoteka na kojem se izvode operacije
  • $flags (opciono): jedna ili više zastavica navedenih u dokumentaciji

Prava razlika u ovim iteratorima je način na koji se koriste za navigaciju datom putanjom.

FilesystemIterator

Korištenje FilesystemIterator-a je vrlo jednostavno. Pogledajmo to na djelu. Predstavljamo dva primjera. Prvi prikazuje pretragu svih datoteka i direktorija čija imena počinju sa “te”. Drugi primjer koristi drugi RegexIterator za pronalaženje svih datoteka i direktorija čija imena završavaju sa “t.dat” ili “t.php”. RegexIterator se koristi za filtriranje rezultata na osnovu regularnih izraza.

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

Gornji kod će dati rezultat sličan prethodnim primjerima.

Drugi primjer korištenja RegexIterator-a:

getFilename(); )

Izaći će:

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

RecursiveDirectoryIterator

RecursiveDirectoryIterator pruža sučelje za rekurzivno kretanje kroz direktorije sistema datoteka. Ima nekoliko korisnih metoda, kao što su getChildren() i hasChildren(), koje vraćaju iterator za trenutnu lokaciju ako je direktorij i provjeravaju da li je trenutna ulazna točka direktorij. Sljedeći primjer pokazuje upotrebu RecursiveDirectoryIterator i getChildren() . Rezultat će biti isti kao u prethodnim primjerima.

getChildren(), "/t\.(php|dat)$/"); $filelist = niz(); foreach($filter kao $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator iterira kroz sistem datoteka na isti način kao i funkcija glob(). Prvi parametar može uključivati ​​obrazac za ime. Primjer pokazuje upotrebu GlobIteratora sa istim rezultatom kao i prije.

getFilename(); )

Zaključak

Ova lekcija pokazuje upotrebu različitih pristupa za postizanje istog cilja: dobivanje liste datoteka i direktorija. Treba zapamtiti sljedeće ključne tačke:

  • Funkcija glob() je ugrađeno rješenje, ali nije dovoljno fleksibilna.
  • Rješenje zasnovano na opendir(), readdir() i closeir() je složenije i zahtijeva dodatno filtriranje, ali je fleksibilnije.
  • Funkcija scandir() zahtijeva dodatno filtriranje, ali radi bez obrade ručke.
  • Ako koristite OOP pristup, trebali biste koristiti SPL biblioteku. Osim toga, možete proširiti nastavu s vlastitom funkcionalnošću.
  • GlobIterator ima funkciju prethodnog filtriranja, dok drugi koriste RegexIterator.

Reg.ru: domeni i hosting

Najveći registrator i hosting provajder u Rusiji.

Više od 2 miliona imena domena u upotrebi.

Promocija, domenska pošta, poslovna rješenja.

Više od 700 hiljada kupaca širom svijeta već je odlučilo.

*Pređite mišem preko za pauziranje pomicanja.

Nazad Naprijed

Dobivanje liste foldera pomoću PHP-a

Ispisivanje direktorija koristeći PHP, ili listanje direktorija

Nazvat ćemo popis direktorija općim upitom koji generiše listu svih ili nekih datoteka i direktorija roditeljskog direktorija - proces sličan radu indeksne stranice koju pruža većina web servera, ali sa O Veća kontrola nad sadržajem i formatiranjem istih.

Još jedna prednost ove skripte je mogućnost izvođenja određenih radnji sa fajlovima koristeći PHP. U svakom slučaju, prvi korak koji treba da uradimo je da ispitamo sistem datoteka – vratimo listu datoteka i direktorijuma.

Funkcije predstavljene u nastavku vam omogućavaju da izdvojite imena datoteka i druga svojstva iz određenog direktorija ili rekurzivno ponavljate kroz potkategorije.

komentar: PHP5 ima funkciju scandir, koji „vraća listu datoteka i direktorija unutar direktorija na datoj putanji“, ali ne prikazuje nikakve dodatne informacije o datotekama unutar direktorija.

Listing jednog direktorija

Za početak, evo primjera jednostavne funkcije koja vraća listu datoteka, direktorija i njihovih svojstava iz jednog direktorija (naprednije verzije ove funkcije naći ćete malo kasnije u ovoj lekciji.)

read())) ( // preskoči skrivene datoteke if($entry == ".") nastavi; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("name" = > "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval;

) ?>

Ovu funkciju možete koristiti na sljedeći način:

Povratna vrijednost je asocijativni niz datoteka, uključujući informacije o putanji datoteke, veličinu i datum posljednje izmjene, osim ako datoteka nije direktorij, u kom slučaju se umjesto veličine datoteke pojavljuje string "(dir)"."; /* primjer izlaznog niza ( => Niz ( => images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Primjer 2:

Povratna vrijednost je asocijativni niz datoteka, uključujući informacije o putanji datoteke, veličinu i datum posljednje izmjene, osim ako datoteka nije direktorij, u kom slučaju se umjesto veličine datoteke pojavljuje string "(dir)"."; /* primjer izlaznog niza ( => Niz ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Popis datoteka putem HTML-a

Da bismo dobili izlazne rezultate na stranici u HTML-u, proći ćemo kroz vraćeni niz

\n"; eho " ImeTipVeličinaLast Mod.\n"; foreach($dirlist kao $file) ( echo " \n"; eho " ($file["name"])\n"; eho " ($file["type"])\n"; eho " ($file["size"])\n"; eho " \n"; eho "\n"; ) echo "\n\n"; ?>

Ovaj kod je prilično lako modificirati, na primjer:

  • - prikazati rezultate listinga kao listu umjesto tabele;
  • - neka imena datoteka budu aktivni linkovi;
  • - zamijenite imena ikonama na osnovu vrste datoteke;
  • itd.

Na primjer, da biste izbacili samo PNG datoteke, dodajte jednostavan uvjet u izlaznu petlju:

\n"; eho " ImeTipVeličinaLast Mod.\n"; foreach($dirlist kao $file) ( //provjeri da li je datoteka PNG if(!preg_match("/\.png$/", $file["name"])) nastavi; echo " \n"; eho " ($file["name"])\n"; eho " ($file["type"])\n"; eho " ($file["size"])\n"; eho " ",date("r", $file["lastmod"]),"\n"; eho "\n"; ) echo "\n\n"; ?>

Ovaj primjer će preskočiti i sakriti sve datoteke čija se imena završavaju .png. Također možete primijeniti dodatne uvjete na osnovu tipa datoteke, veličine ili datuma posljednje izmjene.

Ako, na primjer, želite prikazati sličicu, vezu do veće slike ili čak video, samo dajte ova 2 fajla ista imena i u gornjoj skripti koristite str_replace ili sličnu funkciju za izmjenu sadržaja linkova.

Rekurzivni popis direktorija

A pošto smo došli ovako daleko, biće samo manjih izmena u funkciji pozivanja rekurzivne liste i potkategorije. Dodavanjem drugog parametra funkciji, zadržavamo prethodnu funkcionalnost ispisivanja jednog direktorija.

read())) ( // preskoči skrivene datoteke if($entry == ".") nastavi; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( $retval = array_merge($ retval, getFileList("$dir$entry/", true) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) $d->close();

return $retval; ) ?> Da bi nova funkcionalnost radila, morate unijeti vrijednost

Prije ponavljanja skripte, provjerite da li su poddirektoriji čitljivi i također pročitajte posljednji pasus ove lekcije kako biste izbjegli greške u pristupu.

Kao i ranije, povratna vrijednost je niz, asocijativni niz. Zapravo, jedini dodatak je još jedna dodatna opcija za rekurzivno izlistavanje.

Ograničenje dubine rekurzije

Ovaj završni primjer dodaje još jednu osobinu - mogućnost da se specificira koliko "duboko" treba da ide rekurzija. Prethodni kod će nastaviti da istražuje poddirektorijume sve dok se ne potroše. Ova skripta će vam pomoći da postavite ograničenje na broj nivoa ugniježđenih direktorija.

read())) ( // preskoči skrivene datoteke if($entry == ".") nastavi; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( if($depth == = false) ( $retval = array_merge($retval, getFileList("$dir$entry/", true)); ) elseif($depth > 0) ( $retval = array_merge($retval, getFileList("$dir$entry) /", true, $depth-1)); ) ) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval; false) ?>