Zobrazenie názvov súborov z priečinka PHP. Scandir - prijíma zoznam súborov a adresárov umiestnených na zadanej ceste. Obmedzenie hĺbky rekurzie

  • 20.06.2020

V tejto lekcii sa budeme zaoberať typickou úlohou, ktorá sa vyskytuje pri práci na projekte PHP: prijímanie zoznamu súborov a adresárov. Budeme diskutovať o niekoľkých základných a sofistikovaných prístupoch, pričom zoznam plusy a mínusov. Prvé tri riešenia budú používať typické funkcie PHP a potom si predstavte spoľahlivejšie pomocou SPL Iterátorov.

Pre predmet diskusie o rozhodnutí a demonštráciách predpokladať, že štruktúra adresára je nasledovná:

--- Manager | --- Užívateľ | --- Document.txt | --- Data.DAT | --- style.css | --- Článok.txt | --- Master.Dat | --- Script.php | --- Test.Dat | --- Text.txt

Základné riešenia

Prvá sada riešení je založená na používaní funkcie globálnej (), kombinácie funkcií OpenDIR (), ReadDIR () a Closedrid () a tiež scandir () funkcie.

Používanie glob ()

Prvý roztok je založený na používaní funkcie globage (), ktorý umožňuje vyhľadávať cestu pomocou šablón. Funkcia má dva parametre:

  • $ Vzor (povinné): šablóna vyhľadávania
  • $ Flags (voliteľné): jedna alebo viac vlajok, ktorého opis nájdete v dokumentácii

Zvážte príklady. Vyhľadávanie v adresári všetkých súborov a adresárov, ktorých mená končia .TXTMali by ste použiť kód:

Ak odvodíte variabilný $ filelist, dostaneme:

Array (0 \u003d\u003e "Článok.txt", 1 \u003d\u003e "text.txt")

Ak potrebujete zoznam súborov a adresárov, ktorých mená začínajú na "TE", kód bude vyzerať takto:

A záver je:

Array (0 \u003d\u003e "test.DAT", 1 \u003d\u003e "text.txt")

A získať zoznam, iba adresár s menami obsahujúcimi "MA" použite kód:

Posledný príklad prinesie:

Array (0 \u003d\u003e "Manager")

Upozorňujeme, že vlajka glob_onlydir sa používa v poslednom príklade ako druhý parameter funkcie. Preto je súbor majster.dat vylúčený zo zoznamu. Hoci funkcia globína () je veľmi ľahko ovládateľná, niekedy nie je dostatočne flexibilná. Napríklad neexistuje žiadna vlajka na prijímanie iba súborov (bez adresárov), ktoré zodpovedajú šablóne.

Používame OpenDir (), ReadDir () a zatvorené ().

Druhý prístup k získaniu zoznamu súborov a zoznamov, o ktorých budeme diskutovať, je použiť funkcie OpenDir (), ReadDIR () a Closedrid ().

Funkcia OpenDir () otvorí adresár a vráti deskriptor pripojenia. Akonáhle je deskriptor získaný, môžete použiť funkciu ReadDir (). S každým odkazom sa táto funkcia zobrazí názov nasledujúceho súboru alebo adresára vo vnútri otvoreného adresára. Ak už boli uvedené všetky mená, funkcia sa vracia falošný. Na zatvorenie deskriptora použite funkciu Closedrid ().

Na rozdiel od používania funkcie globage () je tento prístup ťažší, pretože nemáte parametre, ktoré pomáhajú filtrovať zoznam vrátených názvov súborov a adresárov. Musíte vykonať filtrovanie, aby ste získali požadovaný výsledok.

Nižšie, príklad vráti zoznam názvov súborov a adresárov začínajúcich na "TE":

Pri vykonávaní nad kódovaným kódom bude $ vstupná premenná bude obsahovať takéto inklúzie ako "." A "..". Ide o dve virtuálne adresáre, ktoré sú k dispozícii v každom adresári súborov. Predstavujú aktuálny katalóg a rodičovský adresár.

Druhý príklad zobrazuje iba súbory obsiahnuté v zadanom adresári.

Príklad uvedie:

Array (0 \u003d\u003e "Článok.txt", 1 \u003d\u003e "Master.dat", 2 \u003d\u003e "Script.php", 3 \u003d\u003e "Test.DAT", 4 \u003d\u003e "text.txt")

Použitie Scandir ()

Nakoniec si predstavte funkciu Scandir (). Má len jeden povinný parameter: spôsob, ako čítať. Funkcia vráti pole súborov a adresárov umiestnených na zadanej ceste. Ak chcete získať zoznam súborov a adresárov na konkrétnom kritériu, musíte vykonať ďalšie filtrovanie. Na druhej strane sa riešenie získa viac stručne a nevyžaduje manažment deskriptorov.

Tento príklad ukazuje, ako získať zoznam súborov a adresárov, ktorých mená začínajú na "TE":

Používame SPL Iterators

Teraz zvážte pomocou Iterátorov. Ale pred pokračovaním s riešením našej úlohy, predstavíme SPL a Iterátori do knižnice. Knižnica SPL poskytuje sériu tried pre objektovo orientované dátové štruktúry, iterátory, deskriptory súborov a tak ďalej.

Jednou z výhod iterátorov je, že sú to triedy a môžu sa rozšíriť tak, aby uspokojili svoje vlastné potreby. Ďalším plus je, že iterátori majú svoje vlastné metódy, ktoré sú užitočné pri riešení množstva typických úloh a nachádzajú sa na jednom mieste. Pozrite sa na príklad používania aplikácie FilesteMiterátor v porovnaní s ReadDir (). Obidve metódy používajú cyklus, ale v prípade čítania ReadDir () len zvládnete len reťazec a súborové systémy pracuje s objektom, ktorý môže obsahovať ďalšie informácie o súbore alebo adresári (veľkosť, vlastník, prístupové práva, a tak ďalej) .

Samozrejme, PHP je príležitosťou na získanie takýchto informácií pomocou funkcií, ako sú súbory () a fileowner (). Ale PHP5 je založený na používaní konceptu OOP. Preto je lepšie používať moderné metódy práce s programovacím jazykom. Na našich stránkach sa nachádzajú lekcie venované práci s iterátormi.

Ako už bolo uvedené vo vodnej časti lekcie, zvážime použitie súborových systémov, rekurriSimeroryiterátor a globiterátora. Prvý je zdedený z adresára a zvyšok z hotela FilestuMiterátor. Všetci majú rovnaký konštruktor, ktorý má dva parametre:

  • $ Cesta (povinné): cesta k položke súborového systému, nad ktorou sa vykonávajú operácie
  • $ Vlajky: jedna alebo viac vlajok uvedených v dokumentácii

Skutočným rozdielom v týchto iterátoroch je ich použiť na navigáciu zadanej cesty.

Súborový systémový systém

Použitie sú veľmi jednoduché. Zvážiť v akcii. Predstavujeme dva príklady. Prvý zobrazí vyhľadávanie všetkých súborov a adresárov, ktorých mená začínajú na "TE". Druhý príklad používa iný iterator regexiperator, ktorý chcete vyhľadať všetky súbory a adresáre, ktorých mená sa vyskytujú na "tdat" alebo "t.php". Regexiterátor iterator sa používa na filtrovanie výsledkov na základe regulárnych výrazov.

getFilename (), "TE") \u003d\u003d\u003d 0) ($ Filelist \u003d $ entry-\u003e getFilename ();))

Vyššie uvedený kód zobrazí výsledok podobný predchádzajúcim príkladom.

Druhý príklad používajúci regexiterátor:

getfilename (); )

Vydá:

Array (0 \u003d\u003e "Script.php", 1 \u003d\u003e "test.DAT")

RekusieriVeľiterátori.

RekurriSiMeratoryterator iterator poskytuje rozhranie pre rekurzívny priechod adresárov systému. Má niekoľko užitočných metód, ako sú getchildren () a haschildren (), ktoré vrátia iterator pre aktuálne miesto, ak je to adresár, a skontrolujte, či je aktuálny vstupný bod adresára. Nasledujúci príklad demonštruje použitie rekurtiverimeriterator a getchildren (). Výsledok bude rovnaký ako v predchádzajúcich príkladoch.

getchildren (), "/t(php|dat) @"); $ filelist \u003d pole (); Foreach ($ Filter ako $ entry) ($ Filelist \u003d $ entry-\u003e getFilename ();)

Globitertor

GLOBITETRATOR ITERÁTOR DáBORÁCH SYSTÉMU SÚBORU, ako aj funkciu globage (). Prvý parameter môže obsahovať šablónu pre názov. Príkladom ukazuje použitie globiterátora s rovnakým výsledkom ako predtým.

getfilename (); )

Záver

Táto lekcia ukazuje použitie rôznych prístupov na dosiahnutie toho istého cieľa: prijímanie zoznamu súborov a adresárov. Ďalšie kľúčové body by ste mali pripomenúť:

  • Funkcia globage () je vstavaným riešením, ale nie je dostatočne flexibilný.
  • Riešenie založené na OpenDir (), ReadDir () a Closedrir () je zložitejšie a vyžaduje ďalšie filtrovanie, ale je to flexibilnejšie.
  • Funkcia Scandir () vyžaduje ďalšie filtrovanie, ale funguje bez spracovania deskriptora.
  • Ak používate prístup OOP, mala by sa použiť knižnica SPL. Okrem toho môžete triedy rozšíriť s funkciou.
  • Iteretor globiterátora má funkciu pred filtrom, zatiaľ čo iní používajú regexiterátor.

scandir - Získa zoznam súborov a adresárov umiestnených na zadanej ceste

Popis

Pole. scandir. (string $ Directory. [, int $ Sorting_order \u003d SCANDIR_SORT_SENTY [, zdroj $ kontext. ]])

Výnosy pole.obsahujúce názvy súborov a adresárov umiestnených pozdĺž cesty prenášanej v parametri adresára.

Zoznam parametrov

Naskenovaný katalóg.

Triedenie_ort

Štandardne sa triedenie vyrába v abecednom poradí vo vzostupnom. Ak je nastavený voliteľný parameter triedenia_order Scandir_sort_DecDendTriedenie sa uskutočňuje v abecednom poradí. Ak je nastavená na hodnotu SCANDIR_SORT_NONETriedenie nie je vykonané.

Kontext.

Pre popis kontextového parametra nájdete v časti "Threads" v tomto návode.

Návratových hodnôt

Výnosy pole. Názvy súborov v prípade úspechu alebo Falošný V prípade chyby. Ak adresár nie je adresár, vráti sa Falošný a vygeneroval správu o chybovom hlásení E_warning.

Zoznam zmien

Príklady

Príklad # 1 Jednoduché príklady funkcie scandir ()

$ DIR \u003d "/ TMP";
$ Súbory1 \u003d Scandir ($ DIR);
$ Súbory2 \u003d Scandir ($ DIR, 1);

Print_r ($ súbory1);
print_r ($ súbory2);
?>

Výsledkom tohto príkladu bude niečo také:

Array (\u003d\u003e. \u003d\u003e .. \u003d\u003e Bar.php \u003d\u003e Foo.txt \u003d\u003e SOMEEDIR) ARRAY (\u003d\u003e SOMEDIR \u003d\u003e FOO.TXT \u003d\u003e BAR.PHP \u003d\u003e .. \u003d\u003e.)

Príklad # 2 Alternatívna funkcia scandir () Pre php 4.

$ DIR \u003d "/ TMP";
$ Dh \u003d opendir ($ dir);
kým (false! \u003d\u003d ($ názov_))
$ Súbory \u003d $ názov súboru;
}

Triediť ($ súbory);

Print_r ($ súbory);

RSORT ($ súbory);

Print_r ($ súbory);

Reg.ru: domény a hosting

Najväčší rekordér a hosting poskytovateľa v Rusku.

Viac ako 2 milióny doménových mien pre údržbu.

Propagácia, pošta pre doménu, obchodné riešenia.

Viac ako 700 tisíc zákazníkov na celom svete sa už rozhodlo.

* Myš na pozastavenie rolovania.

Vpred

Získavanie priečinkov s PHP

Zoznam adresárových nástrojov PHP alebo zoznam zoznamov

Zoznam adresárov Zavoláme žiadosť o všeobecnú formu, ktorá vygeneruje zoznam všetkých alebo niektorých súborov a katalógov rodičovského adresára - proces podobný práci indexovej stránky, ktorú poskytuje väčšina webových serverov, ale s b odlhé ovládanie nad obsahom a formátovaním.

Ďalšou výhodou tohto skriptu je schopnosť vykonávať určité akty so súbormi pomocou PHP. V každom prípade prvý krok, ktorý potrebujeme urobiť, je žiadosť o súborový systém - vrátiť zoznam súborov a adresárov.

Nižšie uvedené funkcie vám umožňujú extrahovať názvy súborov a iné vlastnosti z konkrétneho adresára alebo prejsť podkategórií rekurzívne.

Komentár: V php5 je funkcia scandir.Ktorá "vráti zoznam súborov a adresárov v rámci adresárov na zadanej ceste", ale nevypočítava žiadne ďalšie informácie o adresári súborov.

Zoznam jedného adresára

Na začiatok je tu príkladom jednoduchej funkcie, ktorá vráti zoznam súborov, adresárov a ich vlastností, z jedného adresára (pokročilé verzie tejto funkcie nájdete trochu nižšie v tejto lekcii.)

Čítať ())) (// Preskočiť skryté súbory, ak ($ \u200b\u200bentry \u003d\u003d ".") Pokračujte; ak (Is_DIR ("$ DIRM $ $")) ($ retval \u003d pole ("Názov" \u003d\u003e "$ DIRM $ Vstup / "," veľkosť "\u003d\u003e 0," lastmod "\u003d\u003e filmtime (" $ dIR $ $ entry ");) inieťíky (IS_READABLE (" $ DIRM $ $ ENTRY ") ($ retval \u003d pole (" názov "\u003d \u003e "$ DIR $ $ ENTRY", "Veľkosť" \u003d\u003e FileSize ("$ DIR $ $ $"), "lastmod" \u003d\u003e filmtime ("$ dIR $ $ $));)) $ D-\u003e CLOSE (); Návrat $ retval; )?\u003e.

Túto funkciu môžete použiť nižšie:

Návratová hodnota je asociatívne pole súborov, ktoré obsahujú informácie o ceste k súboru, veľkosť a dátum poslednej modifikácie, okrem prípadov, keď je súbor adresár, v tomto prípade je reťazec "(DIR)" nastáva namiesto veľkosť súboru.

Príklad 1:

", Print_r ($ Dirist),""; / * Príklad výstupného poľa (\u003d\u003e Array (\u003d\u003e Images / Background0.jpg \u003d\u003e Obrázok / JPEG \u003d\u003e 86920 \u003d\u003e 1077461701) \u003d\u003e ...) * /?\u003e

Príklad 2:

", Print_r ($ Dirist),""; / * Príklad výstupného poľa (\u003d\u003e pole (\u003d\u003e ./images/background0.jpg \u003d\u003e Image / JPEG \u003d\u003e 86920 \u003d\u003e 1077461701) \u003d\u003e ...) * /?\u003e

Výstup zoznamu súborov prostredníctvom HTML

Ak chcete získať výsledky výstupu na stránke HTML, prejdeme sa na spätnom poľa cez cyklus

n "; echo" Názov.TypVeľkosťPosledný mod.n "; Foreach ($ DIRISTER AS $ FILE) (ECHO" n "; echo" ($ FILE ["NAME"])n "; echo" ($ Súbor ["typ"])n "; echo" ($ Súbor ["veľkosť"])n "; echo" n "; echo"n ";) echo"N ";?\u003e

Tento kód je jednoducho modifikovaný, napríklad:

  • - namiesto tabuľky stiahnite výsledky zoznamu zoznamov;
  • - Make názvy súborov Active References;
  • - Vymeňte ikony názvov založené na akom type súboru;
  • atď.

Ak chcete napríklad vydať iba súbory PNG, pridajte do výstupného cyklu jednoduchý stav:

n "; echo" Názov.TypVeľkosťPosledný mod.n "; Foreach ($ DIRISTER AS $ FILE) (// Kontrola príslušnosti súboru do png (! preg_match (" / "$ $ /", $ súbor ["Name"])) Pokračovať; ECHO " n "; echo" ($ FILE ["NAME"])n "; echo" ($ Súbor ["typ"])n "; echo" ($ Súbor ["veľkosť"])n "; echo" ", Dátum (" R ", $ súbor [" lastmod])), "n "; echo"n ";) echo"N ";?\u003e

V tomto príklade všetky súbory, ktorých mená končia .png.. Môžete tiež aplikovať ďalšie podmienky založené na type súboru, jeho veľkosti alebo dátumu poslednej zmeny.

Ak ste napríklad chcete zobraziť miniatúru, odkaz na väčší obrázok, alebo dokonca video, len opýtajte tieto 2 súbory rovnaké mená a v vyššie uvedenom skripte str_replace Alebo podobný znak na úpravu obsahu odkazov.

Rekurzívne riaditeľa výpisu

A keďže sme doteraz prišli, bude existovať len menšie zmeny vo funkcii volania rekurzívneho zoznamu a podkategórie. Pridaním druhého parametra do funkcie uložíme predchádzajúce funkcie zoznamu jediného adresára.

Čítať ())) (// Preskočiť skryté súbory, ak ($ \u200b\u200bentry \u003d\u003d ".") Pokračujte; ak (Is_DIR ("$ DIRM $ $")) ($ retval \u003d pole ("Názov" \u003d\u003e "$ DIRM $ Vstup / "," veľkosť "\u003d\u003e 0," lastmod "\u003d\u003e filimetime (" $ DIRM $ $ ")); ak ($ \u200b\u200brecurse && is_Readable (" $ DIRM $ $ $ / ")) ($ retval \u003d Array_merge ($ Retval RETVAL, GETFILLIST ("$ DIR $ ENTRY /", TRUE));))) Elendif (Is_Readable ("$ DIR $ $ $")) ($ retval \u003d pole ("Názov" \u003d\u003e "$ DIRM $ ENTRY", "veľkosť" "\u003d\u003e Súbory (" $ DIR $ $ $ ")," lastmod "\u003d\u003e filmtime (" $ dIR $ $ $));)) $ D-\u003e Zatvoriť (); Návrat $ retval; )?\u003e.

K novej funkcii zarobíte, musíte zadať hodnotu pravda. (alebo 1) ako druhý parameter.

Skontrolujte recursing scenár, či sú podadresáre čitateľné a tiež si prečítajú poslednú položku tejto lekcie, aby sa zabránilo chybám prístupu.

Ako predtým, vrátená hodnota je pole, asociatívne polia. V skutočnosti je jediným doplnkom ďalšou ďalšou možnosťou pre rekurzívny zoznam.

Obmedzenie hĺbky rekurzie

Tento posledný príklad pridáva ďalšiu nehnuteľnosť - schopnosť určiť, ako by sa mal "hlboko" recurovať. Predchádzajúci kód bude naďalej skúmať investované adresáre, kým sa nedostanú. Tento skript pomôže vytvoriť limit, podľa počtu úrovní vnoreného adresára.

Čítať ())) (// Preskočiť skryté súbory, ak ($ \u200b\u200bentry \u003d\u003d ".") Pokračujte; ak (Is_DIR ("$ DIRM $ $")) ($ retval \u003d pole ("Názov" \u003d\u003e "$ DIRM $ Vstup / "," veľkosť "\u003d\u003e 0," lastmod "\u003d\u003e filimetime (" $ DIRM $ $ ")); ak ($ \u200b\u200brecurse && is_Readable (" $ DIRM $ $ / ")) (ak ($ \u200b\u200bhĺbka \u003d\u003d \u003d FALSE) ($ retval \u003d Array_merge ($ retval, getFilelist ("$ DIRM $ $ /", TRUE));) Elendif ($ hĺbka\u003e 0) ($ retval \u003d array_merge ($ retval, getfilelist ("$ retval, getfilelist (" $ retval / ", TRUE, $ HEPTH-1);)))) Elendif (Is_Rearable (" $ DIR $ $ $ ") ($ retval \u003d pole (" Názov "\u003d\u003e" $ DIRD $ $ "," veľkosť "\u003d\u003e Súbory ("$ DIR $ $ entry"), "lastmod" \u003d\u003e filmtime ("$ dIR $ $ $));)) $ D-\u003e Zatvoriť (); Návrat $ retval; )?\u003e.

Ako predtým sme pridali len 1 nový parameter a pár riadkov kódu. Ak je predvolená hodnota, ktorá je zodpovedná za hĺbku recursing, je nainštalovaná falošný. To nám umožňuje byť presvedčení, že predchádzajúce funkcie zostávajú a následný kód nebude "prerušiť", keď sa funkcia zmení.

Directory v zozname je získať informácie o adresároch a súboroch pre daný materský adresár, ako aj možnosť aplikovať rôzne filtre na tieto údaje na opravu výstupu.

V tomto príklade sa pokúsime vyrovnať sa s typickou úlohou, ktorá sa objavuje v takmer každom Php. Projekt - Získanie zoznamu adresárov a (alebo) súborov. Príklad používa niekoľko základných a zložitejších prístupov, s označením výhod a mínusov každej recepcie. Prvé tri riešenia používajú typické funkcie PHP. Posledné spoľahlivejšie riešenie s použitím Iterátori PHP SPL.


Pre viac vizuálnej prezentácie použite štruktúru adresára, ktorá má nasledujúci formulár:


- -Ser | \\ -Data.apk | astyle.css | --Test.txt | -Readme.txt | -script.php | -serial.txt | -test.html | -test.js

Základné riešenia
Prvá sada príkladov používa funkcie. glob () a kombinácie funkcií openDir (), readDir (), uzavretý ()ako aj funkcia scandir ().

Používanie glob ()

Príklad používania funkcií PHP glob ()Čo vám umožňuje vyhľadávať cestu šablónou.
Funkcia glob ( $ Vzor,$ Vlajky.) Prevádzkuje dve argumenty:
  • $ Vzor (Povinné): Vyhľadávanie šablóny reťazec
  • $ Vlajky.
    • Glob_mark. - pridáva lomku na každý vrátený adresár.
    • Glob_nososort - vráti súbory vo formulári, v ktorom sú obsiahnuté v adresári (bez triedenia). Ak tento príznak nie je zadaný, mená sú zoradené abecedne.
    • Glob_nocheck. - vráti šablónu vyhľadávania, ak s ním nebol nájdený žiadny súbor.
    • Glob_noescape - Inverzné ťahy NEZNAČUJTE META znakov.
    • Glob_brace. - odhaľuje (A, B, C) pre náhodu s "A", "B" alebo "C".
    • Glob_onlydir. - Vracia len adresáre, ktoré zodpovedajú šablóne.
    • Glob_err. - Zastaví sa pri čítaní chýb (napríklad adresár bez čítania vpravo), predvolené chyby sú ignorované.
Ak chcete vyhľadať v adresári všetkých súborov a adresárov, ktorých mená, ktorého utiežujú .txt, kód by mal byť použitý: Vo výstupu získame tento výsledok: Array (2) (\u003d\u003e String (10) "readme.txt" \u003d\u003e String (10) "serial.txt") Ak potrebujete získať zoznam súborov a adresárov, ktorých mená Začnite na "TE": Vo výstupe získavame taký výsledok: Array (2) (\u003d\u003e String (9) "test.html" \u003d\u003e String (7) "test.js") Získanie iba adresárov s názvami obsahujúcimi "er" v zozname : Vo výkone dostaneme taký výsledok: pole (1) (\u003d\u003e reťazec (4) "používateľ")

V druhom príklade použila príznak Glob_onlydir. Ako druhý argument funkcie. Z toho vyplýva, že zoznam prišiel do zoznamu, nájdete len "User" adresár v názve "ER". Funkcia globage () je veľmi ľahko ovládateľná, ale niekedy nie je dostatočne flexibilná. Neexistuje žiadna vlajka na prijímanie iba súborov (bez adresárov), ktoré zodpovedajú šablóne.

Použite OpenDir (), ReadDir () a uzavretý ().

Nasledujúca metóda na získanie zoznamu súborov a adresárov je použitie funkcií PHP. openDir (), readDir () a uzavretý ().

Funkcia openDir () Vráti otvorený riaditeľský deskriptor. Po získaní deskriptora môžete použiť funkciu readDir (). Pri prístupe k funkcii deskriptora readDir () Poskytuje meno nasledujúceho súboru alebo adresára. Ak už boli všetky prvky obsiahnuté v deskriptore uvedené, funkcia readDir () Ropsp falošný. Ak chcete zavrieť deskriptor, použite funkciu uzavretý ().


Na rozdiel od používania funkcií PHP Tento prístup je trochu zložitejší. Neexistuje možnosť nastaviť parametre filtrovania, ktoré pomáhajú predformovať zoznam vrátených názvov a adresárov. Ak chcete získať požadovaný zoznam súborov a adresárov, musí sa filtrovanie vykonávať nezávisle.


Vyššie uvedený príklad vráti zoznam názvov súborov a adresárov začínajúcich na "USA": Vo výstupnom získame tento výsledok: Array (1) (\u003d String (4) "User") Nasledujúci príklad zobrazí iba súbory obsiahnuté v zadanom adresári. Vo výkone získavame tento výsledok: Array (5) (\u003d\u003e String (10) "Script.php" \u003d\u003e String (7) "Test.js" \u003d\u003e String (9) "test.html" \u003d\u003e reťazec (10) "serial.txt" \u003d\u003e reťazec (10) "readme.txt")

Pomocou scandir ().

Dokončiť, pozrime sa príklad použitia funkcií PHP. scandir (). Má len jeden povinný atribút - cesta do čítacieho adresára. Výsledkom funkcie je pole súborov a adresárov umiestnených na ceste uvedenej v argumente. Rovnako ako v predchádzajúcom príklade, aby ste získali filtrovaný zoznam súborov a adresárov, je potrebné ho vykonať sami. Vizuálne riešenie sa otáča kratšie a nevyžaduje správu deskriptorov.


Príklad ukazuje, ako získať zoznam súborov a adresárov, ktorých mená začínajú na "te": Vo výkone dostaneme taký výsledok: pole (2) (\u003d\u003e reťazec (9) "test.html" \u003d\u003e string (7) "test.js")

Pokročilé riešenie pomocou PHP SPL
Spoľahlivé riešenie pomocou SPL Iterators Súborový systémový systém, RekusieriVeľiterátori. a Globitertor.

Použite SPL iterators.

Zvážiť pomocou SPL Iterators. Predtým, ako začnete riešiť problém, budeme sa mierne oboznámení s PHP knižnicou SPL a iterátormi. Knižnica SPL poskytuje špecializované triedy pre objektovo orientované dátové štruktúry, iterátory, deskriptory súborov a tak ďalej.


Hlavnou výhodou iterátorov je, že sú to triedy a môžu sa rozšíriť pomocou štandardného mechanizmu dedičstva PHP. Ďalším plusom je, že iterátori majú svoje vlastné metódy, ktoré môžu byť užitočné pri riešení typických úloh a všetky z nich sú umiestnené na jednom mieste. Pozrime sa na príklad použitia Súborový systémový systém a porovnať S. readDir (). Obe metódy používajú cyklus, ale v prípade readDir () Ukazuje sa, že zvládne len reťazec a Súborový systémový systém môže pracovať s objektom. V ktorom môže byť viac informácií o súbore alebo adresári, ako je napríklad vlastník, veľkosť, prístupové práva a tak ďalej.


Samozrejme, PHP má možnosť prijímať tieto informácie pomocou funkcií, veľkosť súboru (), fileOwner () A ďalšie. Ale PHP ako akýkoľvek programovací jazyk má vlastnosti na zmenu. V php5 je túžba používať koncepciu OOP, čoraz viac sleduje. Preto je lepšie používať moderné metódy práce s programovacím jazykom.


Zvážiť použitie Súborový systémový systém, RekusieriVeľiterátori. a Globitertor. Prvý iterator je zdedený Adresár.a zvyšok Súborový systémový systém. Všetci majú tých istých dizajnérov, ktorí majú dva argumenty:

  • $ Cesta. (povinné): cesta k položke súborového systému, nad ktorou sa vykonávajú operácie
  • $ Vlajky. (nepovinné): jedna alebo viac vlajok
    • Súborystemiterátor :: aktuálne_as_pathname. Spôsobuje metódu programu FileStempiterator :: Aktuálna () na vrátenie cesty.
    • Súborystemiterátor :: current_as_fileinfo. Spôsobuje metódu FILESTEMITEMÁTOR :: Aktuálna metóda () na vrátenie inštancie Splfileinfo.
    • FileSystemterator :: AKTIVITY_AS_SOP. Vytvára súborový systém :: Aktuálna () metóda vrátiť sa na $ This (FilesYstemterator).
    • FileSystemterator :: AKTIVITY_MODE_MASKA. Masky Filesystemiterátor :: Aktuálny ()
    • FileSystemTrator :: KEY_AS_APPARTNAME. Robí metódu FileSystemTerterTer :: Tlačidlo () ().
    • Súborystémový systém :: KEY_AS_FILENAME. Robí metódu FileStelestator :: Tlačidlo () na vrátenie názvu súboru.
    • FileSystemTrator :: SLOWN_SYMLINKS. Spôsobuje rekurstiViDirectorytertor :: Haschildren () metóda sledovať symbolické odkazy.
    • Súborystémový systém :: KEY_MODE_MASKA. Masky Filesystemiterátor :: Kľúč ()
    • Súborystemiterátor :: NEW_CURRENT_AND_KEY. Tiež tento súborový systém :: KEY_AS_FILENAME | Súborystemiterátor :: current_as_fileinfo.
    • Súborystemiterátor :: Skip_dots. Skipperové súbory (. A ..).
    • Súborystémový systém :: UNIX_PARTS. Spôsobuje všetok spôsob, ako použiť reverzný SLAM v štýle UNIX, bez ohľadu na predvolené nastavenia systému.

Rozdiel v týchto iterátoroch je ich používať na navigáciu zadanej cesty.

Súborový systémový systém

Použitie Súborový systémový systém veľmi jednoduché.
Príklad zobrazuje vyhľadávanie všetkých súborov a adresárov, ktorých mená začínajú na "TE".

getFilename (), "te") \u003d\u003d\u003d 0): $ ARFILLIST \u003d $ Obfile-\u003e GetFilename (); koniec Ak; Endforeach; // zobraziť výsledok var_dump ($ arfilelist); ?\u003e Na výsledku dostaneme tento výsledok: Array (2) (\u003d\u003e String (7) "Test.js" \u003d\u003e String (9) "test.html")

Príklad použitia iného iteratora Regexiterátor. Vyhľadať všetky súbory a adresáre, ktorých mená končia na "t.js" alebo "t.php". Iterátor Regexiterátor. Používa sa na filtrovanie výsledku a používa mechanizmus regulárnych výrazov.

getfilename (); Endforeach; // zobraziť výsledok var_dump ($ arfilelist); ?\u003e Vo výstupu získame tento výsledok: Array (2) (\u003d\u003e String (10) "Script.php" \u003d\u003e String (7) "Test.js")

RekusieriVeľiterátori.

Iterátor RekusieriVeľiterátori. Poskytuje rozhranie pre rekurzívny prechod adresárov systému súborov. Má niekoľko užitočných metód, ako napr getchildren () a haschildren ()Ktorý vráti iterator pre aktuálne miesto, ak ide o adresár a skontrolujte, či je aktuálny vstupný bod adresára.


RekusieriVeľiterátori. a getchildren (). getchildren (), "/ t (TXT | CSS) $ /"); $ ARFILLIST \u003d ARRAY (); Foreach ($ RXITERATOR AS $ Obfile): $ ARFILLIST \u003d $ Obfile-\u003e GetFilename (); Endforeach; // zobraziť výsledok var_dump ($ arfilelist); ?\u003e Vo výstupe dostaneme tento výsledok v tomto prípade - to je súbor z adresára "User": Array (1) (\u003d\u003e String (8) "test.txt")

Globitertor

Iterátor Globitertor Vykonáva prejsť súborom podobne ako funkciu. Prvý atribút môže obsahovať názov mena.


Príklad ukazuje použitie Globitertor S rovnakým výsledkom ako predtým.getfilename (); Endforeach; // zobraziť výsledok var_dump ($ arfilelist); ?\u003e Vo výstupe dostaneme tento výsledok: Array (2) (\u003d\u003e String (10) "/test.html" \u003d\u003e String (8) "/test.js")

Záver

V príkladoch uvedených príkladoch boli zvažované rôzne metódy PHP, aby sa dosiahol rovnaký cieľ: prijímanie zoznamu súborov a adresárov.

Príklady zahŕňajú tieto hlavné body:

V tejto lekcii sa budeme zaoberať typickou úlohou, ktorá sa vyskytuje pri práci na projekte PHP: prijímanie zoznamu súborov a adresárov. Budeme diskutovať o niekoľkých základných a sofistikovaných prístupoch, pričom zoznam plusy a mínusov. Prvé tri riešenia budú používať typické funkcie PHP a potom si predstavte spoľahlivejšie pomocou SPL Iterátorov.

Pre predmet diskusie o rozhodnutí a demonštráciách predpokladať, že štruktúra adresára je nasledovná:

--- Manager | --- Užívateľ | --- Document.txt | --- Data.DAT | --- style.css | --- Článok.txt | --- Master.Dat | --- Script.php | --- Test.Dat | --- Text.txt

Základné riešenia

Prvá sada riešení je založená na používaní funkcie globálnej (), kombinácie funkcií OpenDIR (), ReadDIR () a Closedrid () a tiež scandir () funkcie.

Používanie glob ()

Prvý roztok je založený na používaní funkcie globage (), ktorý umožňuje vyhľadávať cestu pomocou šablón. Funkcia má dva parametre:

  • $ Vzor (povinné): šablóna vyhľadávania
  • $ Flags (voliteľné): jedna alebo viac vlajok, ktorého opis nájdete v dokumentácii

Zvážte príklady. Vyhľadávanie v adresári všetkých súborov a adresárov, ktorých mená končia .TXTMali by ste použiť kód:

Ak odvodíte variabilný $ filelist, dostaneme:

Array (0 \u003d\u003e "Článok.txt", 1 \u003d\u003e "text.txt")

Ak potrebujete zoznam súborov a adresárov, ktorých mená začínajú na "TE", kód bude vyzerať takto:

A záver je:

Array (0 \u003d\u003e "test.DAT", 1 \u003d\u003e "text.txt")

A získať zoznam, iba adresár s menami obsahujúcimi "MA" použite kód:

Posledný príklad prinesie:

Array (0 \u003d\u003e "Manager")

Upozorňujeme, že vlajka glob_onlydir sa používa v poslednom príklade ako druhý parameter funkcie. Preto je súbor majster.dat vylúčený zo zoznamu. Hoci funkcia globína () je veľmi ľahko ovládateľná, niekedy nie je dostatočne flexibilná. Napríklad neexistuje žiadna vlajka na prijímanie iba súborov (bez adresárov), ktoré zodpovedajú šablóne.

Používame OpenDir (), ReadDir () a zatvorené ().

Druhý prístup k získaniu zoznamu súborov a zoznamov, o ktorých budeme diskutovať, je použiť funkcie OpenDir (), ReadDIR () a Closedrid ().

Funkcia OpenDir () otvorí adresár a vráti deskriptor pripojenia. Akonáhle je deskriptor získaný, môžete použiť funkciu ReadDir (). S každým odkazom sa táto funkcia zobrazí názov nasledujúceho súboru alebo adresára vo vnútri otvoreného adresára. Ak už boli uvedené všetky mená, funkcia sa vracia falošný. Na zatvorenie deskriptora použite funkciu Closedrid ().

Na rozdiel od používania funkcie globage () je tento prístup ťažší, pretože nemáte parametre, ktoré pomáhajú filtrovať zoznam vrátených názvov súborov a adresárov. Musíte vykonať filtrovanie, aby ste získali požadovaný výsledok.

Nižšie, príklad vráti zoznam názvov súborov a adresárov začínajúcich na "TE":

Pri vykonávaní nad kódovaným kódom bude $ vstupná premenná bude obsahovať takéto inklúzie ako "." A "..". Ide o dve virtuálne adresáre, ktoré sú k dispozícii v každom adresári súborov. Predstavujú aktuálny katalóg a rodičovský adresár.

Druhý príklad zobrazuje iba súbory obsiahnuté v zadanom adresári.

Príklad uvedie:

Array (0 \u003d\u003e "Článok.txt", 1 \u003d\u003e "Master.dat", 2 \u003d\u003e "Script.php", 3 \u003d\u003e "Test.DAT", 4 \u003d\u003e "text.txt")

Použitie Scandir ()

Nakoniec si predstavte funkciu Scandir (). Má len jeden povinný parameter: spôsob, ako čítať. Funkcia vráti pole súborov a adresárov umiestnených na zadanej ceste. Ak chcete získať zoznam súborov a adresárov na konkrétnom kritériu, musíte vykonať ďalšie filtrovanie. Na druhej strane sa riešenie získa viac stručne a nevyžaduje manažment deskriptorov.

Tento príklad ukazuje, ako získať zoznam súborov a adresárov, ktorých mená začínajú na "TE":

Používame SPL Iterators

Teraz zvážte pomocou Iterátorov. Ale pred pokračovaním s riešením našej úlohy, predstavíme SPL a Iterátori do knižnice. Knižnica SPL poskytuje sériu tried pre objektovo orientované dátové štruktúry, iterátory, deskriptory súborov a tak ďalej.

Jednou z výhod iterátorov je, že sú to triedy a môžu sa rozšíriť tak, aby uspokojili svoje vlastné potreby. Ďalším plus je, že iterátori majú svoje vlastné metódy, ktoré sú užitočné pri riešení množstva typických úloh a nachádzajú sa na jednom mieste. Pozrite sa na príklad používania aplikácie FilesteMiterátor v porovnaní s ReadDir (). Obidve metódy používajú cyklus, ale v prípade čítania ReadDir () len zvládnete len reťazec a súborové systémy pracuje s objektom, ktorý môže obsahovať ďalšie informácie o súbore alebo adresári (veľkosť, vlastník, prístupové práva, a tak ďalej) .

Samozrejme, PHP je príležitosťou na získanie takýchto informácií pomocou funkcií, ako sú súbory () a fileowner (). Ale PHP5 je založený na používaní konceptu OOP. Preto je lepšie používať moderné metódy práce s programovacím jazykom. Na našich stránkach sa nachádzajú lekcie venované práci s iterátormi.

Ako už bolo uvedené vo vodnej časti lekcie, zvážime použitie súborových systémov, rekurriSimeroryiterátor a globiterátora. Prvý je zdedený z adresára a zvyšok z hotela FilestuMiterátor. Všetci majú rovnaký konštruktor, ktorý má dva parametre:

  • $ Cesta (povinné): cesta k položke súborového systému, nad ktorou sa vykonávajú operácie
  • $ Vlajky: jedna alebo viac vlajok uvedených v dokumentácii

Skutočným rozdielom v týchto iterátoroch je ich použiť na navigáciu zadanej cesty.

Súborový systémový systém

Použitie sú veľmi jednoduché. Zvážiť v akcii. Predstavujeme dva príklady. Prvý zobrazí vyhľadávanie všetkých súborov a adresárov, ktorých mená začínajú na "TE". Druhý príklad používa iný iterator regexiperator, ktorý chcete vyhľadať všetky súbory a adresáre, ktorých mená sa vyskytujú na "tdat" alebo "t.php". Regexiterátor iterator sa používa na filtrovanie výsledkov na základe regulárnych výrazov.

getFilename (), "TE") \u003d\u003d\u003d 0) ($ Filelist \u003d $ entry-\u003e getFilename ();))

Vyššie uvedený kód zobrazí výsledok podobný predchádzajúcim príkladom.

Druhý príklad používajúci regexiterátor:

getfilename (); )

Vydá:

Array (0 \u003d\u003e "Script.php", 1 \u003d\u003e "test.DAT")

RekusieriVeľiterátori.

RekurriSiMeratoryterator iterator poskytuje rozhranie pre rekurzívny priechod adresárov systému. Má niekoľko užitočných metód, ako sú getchildren () a haschildren (), ktoré vrátia iterator pre aktuálne miesto, ak je to adresár, a skontrolujte, či je aktuálny vstupný bod adresára. Nasledujúci príklad demonštruje použitie rekurtiverimeriterator a getchildren (). Výsledok bude rovnaký ako v predchádzajúcich príkladoch.

getchildren (), "/t(php|dat) @"); $ filelist \u003d pole (); Foreach ($ Filter ako $ entry) ($ Filelist \u003d $ entry-\u003e getFilename ();)

Globitertor

GLOBITETRATOR ITERÁTOR DáBORÁCH SYSTÉMU SÚBORU, ako aj funkciu globage (). Prvý parameter môže obsahovať šablónu pre názov. Príkladom ukazuje použitie globiterátora s rovnakým výsledkom ako predtým.

getfilename (); )

Záver

Táto lekcia ukazuje použitie rôznych prístupov na dosiahnutie toho istého cieľa: prijímanie zoznamu súborov a adresárov. Ďalšie kľúčové body by ste mali pripomenúť:

  • Funkcia globage () je vstavaným riešením, ale nie je dostatočne flexibilný.
  • Riešenie založené na OpenDir (), ReadDir () a Closedrir () je zložitejšie a vyžaduje ďalšie filtrovanie, ale je to flexibilnejšie.
  • Funkcia Scandir () vyžaduje ďalšie filtrovanie, ale funguje bez spracovania deskriptora.
  • Ak používate prístup OOP, mala by sa použiť knižnica SPL. Okrem toho môžete triedy rozšíriť s funkciou.
  • Iteretor globiterátora má funkciu pred filtrom, zatiaľ čo iní používajú regexiterátor.