Kotiin / Pelikonsolit / Php hakee viimeksi lisätyn tiedoston alikansioihin. Tiedostojen ja hakemistojen luettelon saaminen PHP:llä. SPL-iteraattorien käyttö

Php hakee viimeksi lisätyn tiedoston alikansioihin. Tiedostojen ja hakemistojen luettelon saaminen PHP:llä. SPL-iteraattorien käyttö

Tällä oppitunnilla käsittelemme tyypillistä tehtävää, joka syntyy työskennellessään PHP-projektissa: tiedostojen ja hakemistojen luettelon saaminen. Keskustelemme useista perus- ja kehittyneemmistä lähestymistavoista ja luettelemme kunkin edut ja haitat. Kolme ensimmäistä ratkaisua käyttävät tavallisia PHP-toimintoja, ja sitten esittelemme tehokkaamman SPL-iteraattoreita käyttäen.

Ratkaisun ja esittelyjen perusteellista käsittelyä varten oletetaan, että hakemistorakenne on seuraava:

\---johtaja | \---käyttäjä | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Perusratkaisuja

Ensimmäinen ratkaisusarja perustuu glob()-funktion käyttöön, opendir()-, readdir()- ja suljettu()-funktioiden yhdistelmään sekä scandir()-funktioon.

glob()

Ensimmäinen ratkaisu perustuu glob()-funktion käyttöön, jonka avulla voit etsiä polkuja kuvioiden avulla. Funktiolla on kaksi parametria:

  • $pattern (pakollinen): hakukuvio
  • $liput (valinnainen): yksi tai useampi lippu, joiden kuvaukset löytyvät dokumentaatiosta

Katsotaanpa esimerkkejä. Voit etsiä hakemistosta kaikkia tiedostoja ja hakemistoja, joiden nimet päättyvät .txt, sinun tulee käyttää koodia:

Jos näytämme $filelist-muuttujan, saamme:

Taulukko (0 => "artikkeli.txt", 1 => "teksti.txt")

Jos tarvitset luettelon tiedostoista ja hakemistoista, joiden nimet alkavat kirjaimella "te", koodi näyttää tältä:

Ja tulos näyttää tältä:

Taulukko (0 => "test.dat", 1 => "teksti.txt")

Ja saadaksesi luettelon vain hakemistoista, joiden nimet sisältävät sanan "ma", käytä koodia:

Viimeinen esimerkki tulostaa:

Taulukko (0 => "johtaja")

Huomaa, että viimeinen esimerkki käyttää GLOB_ONLYDIR-lippua funktion toisena parametrina. Siksi master.dat-tiedosto on jätetty pois luettelosta. Vaikka glob()-funktio on erittäin helppokäyttöinen, se ei joskus ole tarpeeksi joustava. Esimerkiksi, ei ole lippua vain tiedostojen (ei hakemistojen) saamiseksi, jotka vastaavat mallia.

Käytämme opendir() , readdir() ja closedir() .

Toinen tapa saada luettelo tiedostoista ja hakemistoista, josta keskustelemme, on käyttää toimintoja opendir() , readdir() ja closedir().

Opendir()-funktio avaa hakemiston ja palauttaa yhteyskahvan. Kun kahva on hankittu, readdir()-funktiota voidaan käyttää. Tämä funktio palauttaa jokaisen kutsun yhteydessä avoimessa hakemistossa olevan seuraavan tiedoston tai hakemiston nimen. Jos kaikki nimet on jo listattu, funktio palauttaa väärä. Suljetaan kädensija suljettuna ()-funktiota käytetään.

Toisin kuin glob()-funktion käyttäminen, tämä lähestymistapa on monimutkaisempi, koska sinulla ei ole parametreja, jotka auttaisivat suodattamaan palautettujen tiedostojen ja hakemistojen nimiä. Sinun on suoritettava suodatus itse saadaksesi haluamasi tulokset.

Seuraava esimerkki palauttaa luettelon tiedostojen ja hakemistojen nimistä, jotka alkavat kirjaimella "te":

Kun suoritat yllä olevan koodin, $entry-muuttuja sisältää sisällytyksiä, kuten "." Ja "...". Nämä ovat kaksi virtuaalista hakemistoa, jotka ovat jokaisessa hakemistossa tiedostojärjestelmä. Ne edustavat nykyistä hakemistoa ja vastaavasti ylähakemistoa.

Toinen esimerkki näyttää vain tietyn hakemiston tiedostot.

Esimerkki tuottaa seuraavan:

Taulukko (0 => "artikkeli.txt", 1 => "master.dat", 2 => "script.php", 3 => "testi.dat", 4 => "teksti.txt")

Scandir()

Lopuksi esitellään Scandir()-funktio. Siinä on vain yksi pakollinen parametri: lukupolku. Funktio palauttaa joukon tiedostoja ja hakemistoja, jotka sijaitsevat määritetyssä polussa. Jos haluat saada luettelon tiedostoista ja hakemistoista tietyn kriteerin perusteella, sinun on suoritettava lisäsuodatus. Toisaalta ratkaisu on ytimekkäämpi eikä vaadi kahvan hallintaa.

Tämä esimerkki näyttää kuinka saada luettelo tiedostoista ja hakemistoista, joiden nimet alkavat kirjaimella "te":

Käytetään SPL-iteraattoreita

Katsotaanpa nyt SPL-iteraattorien käyttöä. Mutta ennen kuin aloitamme ongelmamme ratkaisemisen, esitellään SPL-kirjasto ja iteraattorit. SPL-kirjasto tarjoaa sarjan luokkia oliopohjaisille tietorakenteille, iteraattoreille, tiedostokuvaajille ja muille.

Yksi iteraattorien eduista on, että ne ovat luokkia ja niitä voidaan laajentaa omien tarpeidesi mukaan. Toinen etu on, että iteraattoreissa on omat menetelmänsä, jotka ovat hyödyllisiä monien yleisten ongelmien ratkaisemisessa ja sijaitsevat yhdessä paikassa. Katso esimerkki FilesystemIteratorin käytöstä readdir() -funktiossa. Molemmat menetelmät käyttävät silmukkaa, mutta readdir():llä käsittelet vain merkkijonoa, kun taas FilesystemIterator toimii objektin kanssa, joka voi sisältää lisätietoja tiedostosta tai hakemistosta (koko, omistaja, käyttöoikeudet ja niin edelleen).

Tietenkin PHP tarjoaa mahdollisuuden hankkia tällaisia ​​tietoja käyttämällä toimintoja, kuten fileize() ja fileowner(). Mutta PHP5 perustuu OOP-konseptiin. Siksi on parempi käyttää nykyaikaisia ​​menetelmiä työskennellä ohjelmointikielen kanssa. Sivustollamme on oppitunteja työskentelystä iteraattorien kanssa.

Kuten opetusohjelman vetisessä osassa jo todettiin, käsittelemme FilesystemIteratorin, RecursiveDirectoryIteratorin ja GlobIteratorin käyttöä. Ensimmäinen perii DirectoryIteratorista ja loput FilesystemIteratorista. Niillä kaikilla on sama konstruktori, joka ottaa kaksi parametria:

  • $polku (pakollinen): polku tiedostojärjestelmämerkintään, jolle toiminnot suoritetaan
  • $liput (valinnainen): yksi tai useampi dokumentaatiossa mainittu lippu

Todellinen ero näissä iteraattoreissa on se, kuinka niitä käytetään navigoimaan tiettyä polkua pitkin.

FilesystemIterator

FilesystemIteratorin käyttö on hyvin yksinkertaista. Katsotaanpa sitä toiminnassa. Esitämme kaksi esimerkkiä. Ensimmäinen näyttää haun kaikista tiedostoista ja hakemistoista, joiden nimet alkavat kirjaimella "te". Toisessa esimerkissä käytetään toista RegexIteraattoria etsimään kaikki tiedostot ja hakemistot, joiden nimet päättyvät "t.dat" tai "t.php". RegexIteratoria käytetään suodattamaan tulos säännöllisten lausekkeiden perusteella.

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

Yllä oleva koodi tuottaa samanlaisen tuloksen kuin edellisissä esimerkeissä.

Toinen esimerkki RegexIteratorista:

getFilename(); )

Se tuottaa:

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

RecursiveDirectoryIterator

RecursiveDirectoryIterator tarjoaa käyttöliittymän tiedostojärjestelmän hakemistojen rekursiivista läpikulkua varten. Siinä on useita hyödyllisiä menetelmiä, kuten getChildren() ja hasChildren(), jotka palauttavat iteraattorin nykyiselle sijainnille, jos se on hakemisto, ja tarkistavat, onko nykyinen aloituspiste hakemisto. Seuraava esimerkki havainnollistaa RecursiveDirectoryIterator- ja getChildren() -funktioiden käyttöä. Tulos on sama kuin edellisissä esimerkeissä.

getChildren(), "/t\.(php|dat)$/"); $tiedostolista = array(); foreach($suodatin $merkintänä) ( $tiedostolista = $entry->getFilename(); )

GlobIterator

GlobIterator iteroi tiedostojärjestelmän läpi samalla tavalla kuin glob()-funktio. Ensimmäinen parametri voi sisältää mallin nimelle. Esimerkki osoittaa GlobIteratorin käytön samalla tuloksella kuin aiemmin.

getFilename(); )

Johtopäätös

Tämä oppitunti esittelee eri lähestymistapojen käyttöä saman tavoitteen saavuttamiseksi: tiedosto- ja hakemistoluettelon saamiseen. Seuraavat keskeiset kohdat on syytä muistaa:

  • Funktio glob() on sisäänrakennettu ratkaisu, mutta se ei ole tarpeeksi joustava.
  • Opendir()-, readdir()- ja suljettu()-pohjainen ratkaisu on monimutkaisempi ja vaatii lisäsuodatusta, mutta se on joustavampi.
  • Scandir()-funktio vaatii lisäsuodatusta, mutta toimii ilman kahvan käsittelyä.
  • Jos käytät OOP-lähestymistapaa, sinun tulee käyttää SPL-kirjastoa. Lisäksi voit laajentaa luokkia omilla toiminnoillasi.
  • GlobIteratorissa on esisuodatusominaisuus, kun taas toiset käyttävät RegexIteratoria.

Reg.ru: verkkotunnukset ja hosting

Venäjän suurin rekisterinpitäjä ja hosting-palvelujen tarjoaja.

Yli 2 miljoonaa verkkotunnusta käytössä.

Promootio, verkkotunnuksen sähköposti, yritysratkaisut.

Yli 700 tuhatta asiakasta ympäri maailmaa on jo tehnyt valintansa.

*Keskeytä vieritys viemällä hiiri päälle.

Takaisin Eteen

Kansioiden luettelon saaminen PHP:llä

Hakemistojen luettelointi PHP:llä tai hakemistojen luettelointi

Kutsumme hakemistolistausta yleiseksi kyselyksi, joka luo luettelon kaikista tai joistakin päähakemiston tiedostoista ja hakemistoista - prosessi, joka on samanlainen kuin useimpien verkkopalvelimien tarjoama hakemistosivu, mutta O enemmän hallintaa saman sisällön ja muotoilun suhteen.

Toinen tämän skriptin etu on kyky suorittaa tiettyjä toimintoja tiedostoilla PHP:n avulla. Joka tapauksessa ensimmäinen askel, joka meidän on tehtävä, on kysely tiedostojärjestelmästä - palauta luettelo tiedostoista ja hakemistoista.

Alla esiteltyjen toimintojen avulla voit poimia tiedostonimiä ja muita ominaisuuksia tietystä hakemistosta tai iteroida alaluokkien läpi rekursiivisesti.

Kommentti: PHP5:llä on toiminto skandir, joka "palauttaa luettelon tietyn polun hakemiston sisältämistä tiedostoista ja hakemistoista", mutta se ei näytä mitään lisätietoja hakemiston sisällä olevista tiedostoista.

Listataan yksi hakemisto

Aluksi tässä on esimerkki yksinkertaisesta funktiosta, joka palauttaa luettelon tiedostoista, hakemistoista ja niiden ominaisuuksista yhdestä hakemistosta (löydät tämän toiminnon edistyneemmät versiot hieman myöhemmin tässä oppitunnissa.)

read())) ( // ohita piilotetut tiedostot if($entry == ".") jatka; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("nimi" = > "$dir$entry", "size" => tiedostokoko("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

palauttaa $retval;

) ?>

Voit käyttää tätä toimintoa seuraavasti:

Palautusarvo on assosiatiivinen tiedostojoukko, joka sisältää tiedoston polun tiedot, koon ja viimeisimmän muokkauspäivämäärän, ellei tiedosto ole hakemisto, jolloin merkkijono "(dir)" näkyy tiedoston koon sijaan. Esimerkki 1:

",print_r($dirlist),"

Palautusarvo on assosiatiivinen tiedostojoukko, joka sisältää tiedoston polun tiedot, koon ja viimeisimmän muokkauspäivämäärän, ellei tiedosto ole hakemisto, jolloin merkkijono "(dir)" näkyy tiedoston koon sijaan."; /* esimerkkituloste Array ( => Array ( => images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Esimerkki 2:

"; /* esimerkkituloste Array ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Tiedostojen luettelointi HTML:n kautta Saadaksemme tulostulokset sivulla HTML-muodossa, käymme läpi palautetun taulukon\n"; kaiku "NimiTyyppi Koko Tiedostojen luettelointi HTML:n kautta Viimeinen mod. Tiedostojen luettelointi HTML:n kautta \n"; foreach($dirlist $tiedostona) ( echo " Tiedostojen luettelointi HTML:n kautta ($tiedosto["nimi"]) Tiedostojen luettelointi HTML:n kautta Tiedostojen luettelointi HTML:n kautta($tiedosto["tyyppi"])($tiedosto["koko"])

\n"; ) echo "

  • \n\n"; ?>
  • Tätä koodia on melko helppo muokata, esim.
  • - näyttää listaustulokset luettelona taulukon sijaan;
  • - Tee tiedostonimistä aktiivisia linkkejä;

- korvaa nimet kuvakkeilla tiedoston tyypin perusteella;

Tiedostojen luettelointi HTML:n kautta Saadaksemme tulostulokset sivulla HTML-muodossa, käymme läpi palautetun taulukon\n"; kaiku "NimiTyyppi jne. Tiedostojen luettelointi HTML:n kautta Viimeinen mod. Tiedostojen luettelointi HTML:n kautta \n"; foreach($dirlist $tiedostona) ( echo " Tiedostojen luettelointi HTML:n kautta ($tiedosto["nimi"]) Tiedostojen luettelointi HTML:n kautta Jos esimerkiksi haluat tulostaa vain PNG-tiedostoja, lisää tulossilmukaan yksinkertainen ehto: Tiedostojen luettelointi HTML:n kautta($tiedosto["tyyppi"])($tiedosto["koko"])

\n"; foreach($dirlist $tiedostona) ( //tarkista onko tiedosto PNG if(!preg_match("/\.png$/", $tiedosto["nimi"])) jatka; echo " ",date("r", $tiedosto["lastmod"]),". Voit myös soveltaa lisäehtoja tiedostotyypin, koon tai viimeisimmän muokkauspäivämäärän perusteella.

Jos haluat esimerkiksi näyttää pikkukuvan, linkin suurempaan kuvaan tai jopa videon, anna näille kahdelle tiedostolle samat nimet ja käytä yllä olevassa skriptissä str_replace tai vastaava toiminto linkkien sisällön muokkaamiseen.

Rekursiivinen hakemistolistaus

Ja koska olemme päässeet näin pitkälle, rekursiiviseen luetteloon ja alakategorioiden kutsumiseen tulee vain pieniä muutoksia. Lisäämällä funktioon toisen parametrin, säilytämme aiemman yhden hakemiston listaamisen toiminnon.

read())) ( // ohita piilotetut tiedostot if($entry == ".") jatka; 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();

palauttaa $retval; ) ?> Jotta uusi toiminto toimisi, sinun on syötettävä arvo

totta

(tai 1) toisena parametrina.

Ennen kuin toistat komentosarjan, tarkista, ovatko alihakemistot luettavissa ja lue myös tämän oppitunnin viimeinen kappale välttääksesi pääsyvirheet.

Kuten ennenkin, palautusarvo on array, assosiatiivinen taulukko. Itse asiassa ainoa lisäys on toinen lisävaihtoehto rekursiiviseen listaukseen.

read())) ( // ohita piilotetut tiedostot if($entry == ".") jatka; 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) /", tosi, $syvyys-1)); ) ) ) elseif(on_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => tiedostokoko("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

palauttaa $retval; ) ?> Kuten ennenkin, lisäsimme vain 1 väärä uusi parametri

ja pari riviä koodia. Jos rekursion syvyydestä vastaavaa oletusarvoa ei ole määritetty, se asetetaan arvoon

. Näin voimme olla varmoja siitä, että aiemmat ominaisuudet säilyvät ja myöhempi koodi ei "riko" funktion muuttuessa.

Työskentely tiedostojen kanssa

Tiedostotoimintojen tarve kohtaa ohjelmoijan hyvin usein. Jos komentosarjasi eivät käytä tietokantoja, tiedostot ovat ainoita hyväksyttäviä tallennusvälineitä komentosarjalle. Tiedostojen käyttö komentosarjan suoritustietojen arkistona mahdollistaa niiden käytön monenlaisissa tilanteissa. Lähes kaikki laskurin komentosarjat joillekin kirjoitetaan tiedostojen käsittelyn perusteella. On myös mahdollista antaa joukko muita esimerkkejä, mutta on aika siirtyä suoraan sanoista tekoihin.

Haluan sanoa heti, että tiedoston kanssa työskenteleminen on valtuutettava. Oletusarvoisesti PHP ei salli tiedostojen käsittelyä turvallisuussyistä. Jos haluat poistaa tämän kiellon CuteFTP FTP -hallinnasta, valitse kaikki tiedoston ominaisuuksien ruudut. file_exists Ennen kuin suoritat toimintoja tiedostolle, sinun on usein varmistettava, että määritetty tiedosto on edes olemassa. Tätä file_exists-funktio tekee. Tämä funktio voi palauttaa vain kaksi arvoa, kuten voit kuvitella TOTTA(jos määritetty tiedosto on olemassa) ja

EPÄTOSI

. Tyypillisesti tämän toiminnon käyttö näyttää tältä:

Huomaa, että toiminto toimii vain paikallisissa tiedostoissa, eli jos haluat tarkistaa, onko Yandex hankkinut robot.txt-tiedoston, ponnistuksesi ovat turhia. Mutta on mahdollista tarkistaa mikä tahansa paikallisella palvelimella sijaitseva tiedosto riippumatta sen sijainnin hakemistosta.

Kuten nimestä voi päätellä, funktio määrittää tiedoston koon ja palauttaa sen tavuina. Hyödyllinen, jos haluat tarkistaa, sisältääkö tiedosto tietoja (kuten voit kuvitella, tyhjä tiedosto sisältää 0 tavua), ja on myös mahdollista tarkistaa tiedoston koko nähdäksesi, ylittääkö se tietyn rajan.

tiedosto

Tämä toiminto toimii jo suoraan tiedoston kanssa. Se palauttaa määritetyn tiedoston sisällön, ja se tekee tämän taulukon muodossa, jossa jokainen elementti on tiedoston rivi. Toiminto on hyödyllinen, kun sinun on tallennettava useita eri arvoja yhteen tiedostoon, joiden ei pitäisi leikkiä. Sitten jokainen arvo tallennetaan omalle riville ja sen lukee tiedostofunktio, joka palauttaa taulukon, jolloin annettuun muuttujaan päästään lukemalla taulukon elementin arvo tiedoston riviä vastaavalla indeksillä.

On myös mahdollista yhdistää kaikki palautetun taulukon elementit yhdeksi muuttujaksi. Tämä tehdään käyttämällä implode-taulukkofunktiota.

fopen

Jos edellinen toiminto on itsenäinen eikä yleensä liity muihin toimintoihin, seuraavat tiedostojen käsittelyyn tarkoitetut toiminnot toimivat yhdessä fopen kanssa. Tämä toiminto avaa määritetyn tiedoston ja palauttaa tiedostoyhteyden tunnisteen, jota käytetään palvelutarkoituksiin. Tämä toiminto ei liity millään tavalla tiedoston sisältöön.

Fopen-toiminnolla on useita tiloja tiedoston käsittelyyn. Ne on merkitty tiedostonimen jälkeen ja ovat seuraavat:

    "r"
    Tiedosto avataan vain sen sisällön lukemista varten.

    "r+"
    Tiedoston avaaminen sekä lukemista että kirjoittamista varten.

    "w"
    Tiedosto avataan kirjoittamista varten.

    "w+"
    Avaa tiedosto lukemista ja kirjoittamista varten.

    "a"
    Tiedosto avataan kirjoittamista varten tiedoston loppuun (liite).

    "a+"
    Aukeaa lisää kirjoittamista ja lukemista varten.

fgets

Toiminto fopen-funktiolla avatun tiedoston lukemiseen. Mutta toisin kuin tiedosto, tämä funktio palauttaa vain yhden rivin tiedostosta joka kerta, kun se suoritetaan, ja se siirtää sisäisen tiedoston osoittimen seuraavalle riville, jonka se lukee seuraavan kerran, kun toimintoa kutsutaan. Siksi, jos sinun on luettava koko tiedosto, sinun on käytettävä tätä toimintoa silmukassa.

Huomaa, että fgets-funktio käyttää ylimääräistä pituusparametria, joka määrittää luettavan tiedostorivin enimmäispituuden. Jos merkkijonon koko ylittää tämän luvun, funktio palauttaa sen "katkaistussa" muodossa, jonka pituus on tavua. Oletuksena tämä parametri on 1024 tavua tai yksi kilotavu. Kiinnitä erityistä huomiota tähän parametriin, jos käytät suuria tiedostoja, koska kun luet tällaisia ​​tiedostoja, PHP-suorituspuskuri voi vuotaa yli (sen koko on ilmoitettu asetustiedostossa), mikä johtaa jumiutumiseen.

Huomaa, että luettava tiedosto ei ole tiedoston nimi, vaan fopen-funktion palauttama tiedostoyhteyden tunniste (esimerkissämme $file-muuttujan arvo).

fputs

Toiminto kirjoittaa tietoa tiedostoon, ja se tekee tämän fgets-funktion periaatteen mukaisesti, eli se aloittaa kirjoittamisen sisäisen tiedostoosoittimen paikasta. Yleisesti ottaen tämä toiminto on monella tapaa samanlainen kuin yllä oleva: se käyttää myös kirjoitusdatan pituusparametria, joka on myös valinnainen.

fclose

Kuten saatat arvata, tämä toiminto sulkee määritetyn tiedoston. Itse asiassa, kun komentosarja on valmis, PHP itse sulkee kaikki avoimet tiedostot, mutta on silti parempi tehdä tämä manuaalisesti. Toimintoparametrina sinun on määritettävä tiedostoyhteyden tunnus.

Havainnollistaaksemme yllä olevien toimintojen yhdistelmää annamme esimerkin yksinkertaisen käyntilaskurin luomisesta.

$tiedosto = fopen("laskuri.txt", "r");
$c = fgets($tiedosto, 150);
fclose($tiedosto);
$c++;
$tiedosto = fopen("laskuri.txt", "w");
fputs($tiedosto, $c);
fclose($tiedosto);
kaiku $c;
?>

Työskentely hakemistojen kanssa

Tiedostojen toimintoihin liittyvät läheisesti hakemistojen toiminnot. Niiden kanssa työskentelyn algoritmi on samanlainen kuin tiedostojen toiminnot: ensin sinun on avattava hakemisto, suoritettava joitain toimintoja ja lopuksi suljettava se.

opendir

Tämä toiminto avaa määritetyn hakemiston ja palauttaa hakemistoyhteyden palvelutunnisteen. Hakemistopolut tulee määrittää seuraavasti:

Piste tarkoittaa nykyisen hakemiston avaamista

. /tiedostot/

Kansion avaaminen tiedostot sijaitsee nykyisessä hakemistossa

Kansion avaaminen nykyistä tasoa korkeammalla

readdir

Funktio lukee opendir avaaman hakemiston. Jokaisella passilla se palauttaa määritetyssä hakemistossa olevan tiedoston tai kansion nimen ja siirtää sisäisen osoittimen seuraavaan hakemistoobjektiin. Joten koko hakemiston lukemiseksi sitä on käytettävä silmukassa.

On myös huomattava, että tämä toiminto palauttaa kansion palveluobjekteja . Ja .. , jota voidaan leikata IF-käskyn tulostaessa.

suljettuna

Suljemme hakemiston ja määritämme kansioyhteyden tunnisteen argumenttina.

Joskus hakemistotoimintojen käyttö helpottaa elämää paljon. Esimerkiksi Ominaisuudet-osiossa näet luettelon ominaisuuksista aakkosjärjestyksessä. Voitteko kuvitella, kuinka paljon aikaa kuluisi tämän koko luettelon manuaaliseen kirjoittamiseen linkkien kanssa ja jopa aakkosjärjestyksessä. Ja tässä hakemistojen kanssa työskentelyn toiminnot auttoivat minua. Jokainen funktio sijoitettiin erilliseen tiedostoon funktion nimeä vastaavalla nimellä ilman päätteitä.

Joten joka kerta kun käyt sivulla, saat juuri luodun luettelon toiminnoista.

Siinä kaikki. Nähdään seuraavalla oppitunnilla.

Hakemistoluettelo on prosessi, jolla hankitaan tietoja tietyn päähakemiston hakemistoista ja tiedostoista sekä mahdollisuus käyttää erilaisia ​​suodattimia näihin tietoihin tulosteen korjaamiseksi.

Tässä esimerkissä yritämme selviytyä tyypillisestä tehtävästä, joka esiintyy melkein jokaisessa PHP projekti - hakemistojen ja/tai tiedostojen luettelon hankkiminen. Esimerkissä käytetään useita perus- ja monimutkaisempia lähestymistapoja, joissa esitetään kunkin tekniikan edut ja haitat. Kolme ensimmäistä ratkaisua käyttävät tavallisia PHP-toimintoja. Uusin luotettavampi ratkaisu PHP SPL -iteraattoreilla.


Visuaalisempaa esitystä varten käytämme hakemistorakennetta, joka näyttää tältä:


\-Sovellus | \-Käyttäjä | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Perusratkaisuja
Ensimmäinen esimerkkisarja käyttää funktioita loraus() ja toimintojen yhdistelmät opendir(), readdir(), suljettu(), sekä toiminto scandir().

glob()

Käyttöesimerkki php toiminnot loraus(), jonka avulla voit etsiä polkua kuvion avulla.
Toiminto loraus( $pattern,$lippuja) toimii kahdella argumentilla:
  • $pattern(pakollinen): hakumallimerkkijono
  • $lippuja
    • GLOB_MARK- Lisää vinoviivan jokaiseen palautettuun hakemistoon.
    • GLOB_NOSORT- Palauttaa tiedostot siinä muodossa, jossa ne ovat hakemistossa (ilman lajittelua). Jos tätä lippua ei ole määritetty, nimet lajitellaan aakkosjärjestyksessä.
    • GLOB_NOCHECK- Palauttaa hakumallin, jos sitä käyttäviä tiedostoja ei löytynyt.
    • GLOB_NOESCAPE- Kenoviivat eivät vältä metamerkkejä.
    • GLOB_BRACE- Laajenee (a,b,c) vastaamaan "a", "b" tai "c".
    • GLOB_ONLYDIR- Palauttaa vain mallia vastaavat hakemistot.
    • GLOB_ERR- Pysähtyy lukuvirheissä (esimerkiksi hakemistot ilman lukulupaa), oletusarvoisesti virheet ohitetaan.
Voit etsiä hakemistosta kaikkia tiedostoja ja hakemistoja, joiden nimet päättyvät .txt-muotoon, käyttämällä seuraavaa koodia:Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Jos haluat saada luettelon tiedostoista ja hakemistoista, joiden nimet alkaa "te":llä:Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Haetaan vain hakemistoja, joiden nimet sisältävät listassa "er":Tulosteessa saamme seuraavan tuloksen: array(1) ( => string(4) "Käyttäjä" )

Viimeisessä esimerkissä käytetään lippua GLOB_ONLYDIR funktion toisena argumenttina. Siksi vain nimessä oleva "Käyttäjä"-hakemisto, joka sisältää "er", sisällytettiin luetteloon. Funktio glob() on erittäin helppokäyttöinen, mutta joskus se ei ole tarpeeksi joustava. Ei ole lippua vain mallia vastaavien tiedostojen (ei hakemistojen) saamiseksi.

Käytä opendir(), readdir() ja closedir().

Seuraava tapa saada luettelo tiedostoista ja hakemistoista on käyttää PHP-funktioita opendir(), readdir() Ja suljettu().

Toiminto opendir() palauttaa kahvan avoimeen hakemistoon. Kun kahva on vastaanotettu, voit käyttää toimintoa readdir(). Kun päästään käsiksi kahvaan, toiminto readdir() näyttää seuraavan tiedoston tai hakemiston nimen. Jos kaikki kuvaajan sisältämät elementit on jo lueteltu, funktio readdir() tulee takaisin väärä. Käytämme funktiota kuvaajan sulkemiseen suljettu().


Toisin kuin php-funktion käyttäminen , tämä lähestymistapa on hieman monimutkaisempi. Ei ole mahdollista asettaa suodatusparametreja, jotka auttavat luomaan luettelo palautetuista tiedosto- ja hakemistonimistä etukäteen. Tarvittavan tiedosto- ja hakemistoluettelon saamiseksi suodatus on suoritettava itsenäisesti.


Seuraava esimerkki palauttaa luettelon tiedostojen ja hakemistojen nimistä, jotka alkavat "Us":Tulos on: array(1) ( => string(4) "Käyttäjä" ) Seuraava esimerkki tulostaa vain tietyn hakemiston sisältämät tiedostot.Tulosteessa saamme seuraavan tuloksen: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => string(10) "readme.txt" )

Käyttämällä scandir().

Katsotaan lopuksi esimerkkiä php-funktion käytöstä scandir(). Siinä on vain yksi pakollinen attribuutti - polku lukuhakemistoon. Toiminnon tulos on joukko tiedostoja ja hakemistoja, jotka sijaitsevat argumentissa määritettyä polkua pitkin. Kuten edellisessä esimerkissä, sinun on suoritettava se itse saadaksesi suodatetun luettelon tiedostoista ja hakemistoista. Visuaalisesti ratkaisu on lyhyempi eikä kuvausten hallintaa tarvita.


Esimerkki näyttää kuinka saada luettelo tiedostoista ja hakemistoista, joiden nimet alkavat kirjaimella "te":Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Kehittynyt ratkaisu PHP SPL:llä
Luotettavampi ratkaisu SPL-iteraattorien avulla FilesystemIterator, RecursiveDirectoryIterator Ja GlobIterator.

SPL-iteraattorien käyttö.

Katsotaanpa SPL-iteraattorien käyttöä. Ennen kuin aloitamme ongelman ratkaisemisen, tutustutaan hieman PHP SPL -kirjastoon ja iteraattoreihin. SPL-kirjasto tarjoaa erikoisluokkijoukkoja oliopohjaisille tietorakenteille, iteraattoreille, tiedostokuvaajille ja muille.


Iteraattorien tärkein etu on, että ne ovat luokkia ja niitä voidaan laajentaa käyttämällä vakiomekanismia php:n perintö luokat. Toinen plus on se, että iteraattoreilla on omat menetelmänsä, jotka voivat olla hyödyllisiä yleisten ongelmien ratkaisemisessa, ja ne sijaitsevat kaikki yhdessä paikassa. Katsotaanpa esimerkkiä käytöstä FilesystemIterator ja vertailla readdir(). Molemmat menetelmät käyttävät silmukkaa, mutta siinä tapauksessa readdir() on mahdollista käsitellä vain merkkijono, mutta FilesystemIterator voi työskennellä esineen kanssa. Joka voi sisältää lisätietoja tiedostosta tai hakemistosta, kuten omistaja, koko, käyttöoikeudet ja niin edelleen.


Tietenkin PHP pystyy hankkimaan nämä tiedot funktioiden avulla, tiedostokoko(), tiedostonomistaja() ja muut. Mutta PHP:llä, kuten kaikilla ohjelmointikielillä, on kyky muuttua. PHP5:ssä on kasvava halu käyttää OOP-konsepteja. Siksi on parempi käyttää nykyaikaisia ​​​​menetelmiä työskennellä ohjelmointikielen kanssa.


Harkitse käyttöä FilesystemIterator, RecursiveDirectoryIterator Ja GlobIterator. Ensimmäinen iteraattori on peritty DirectoryIterator, ja loput osoitteesta FilesystemIterator. Niillä kaikilla on sama konstruktori, joka vaatii kaksi argumenttia:

  • $polku(pakollinen): polku tiedostojärjestelmäkohteeseen, jolle toiminnot suoritetaan
  • $lippuja(valinnainen): yksi tai useampi lippu
    • FilesystemIterator::CURRENT_AS_PATHNAME Saattaa FilesystemIterator::current()-metodin palauttamaan polun.
    • FilesystemIterator::CURRENT_AS_FILEINFO Saattaa FilesystemIterator::current()-metodin palauttamaan SplFileInfo-esiintymän.
    • FilesystemIterator::CURRENT_AS_SELF Saattaa FilesystemIterator::current()-metodin palauttamaan $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Peittää FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Saattaa FilesystemIterator::key()-metodin palauttamaan polun.
    • FilesystemIterator::KEY_AS_FILENAME Saattaa FilesystemIterator::key()-metodin palauttamaan tiedostonimen.
    • FilesystemIterator::FOLLOW_SYMLINKS Pakottaa RecursiveDirectoryIterator::hasChildren() -menetelmän seuraamaan symbolisia linkkejä.
    • FilesystemIterator::KEY_MODE_MASK Peittää FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Sama kuin FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Ohittaa pistetiedostot (. ja ..).
    • FilesystemIterator::UNIX_PATHS Pakottaa kaikki polut käyttämään Unix-tyylisiä kenoviivaa järjestelmän oletusasetuksista riippumatta.

Ero näissä iteraattoreissa on se, kuinka niitä käytetään navigoimaan tiettyä polkua pitkin.

FilesystemIterator

Käyttää FilesystemIterator hyvin yksinkertainen.
Esimerkki näyttää haun kaikista tiedostoista ja hakemistoista, joiden nimet alkavat kirjaimella "te".

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

endif; endforeach; //Näytä tulos var_dump($arFileList); ?> Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(7) "test.js" => string(9) "test.html" ) Esimerkki toisen iteraattorin käytöstä RegexIterator Esimerkki toisen iteraattorin käytöstä etsiäksesi kaikki tiedostot ja hakemistot, joiden nimet päättyvät "t.js" tai "t.php". Iteraattori

käytetään suodattamaan tulos ja käyttää säännöllistä lauseketta.

RecursiveDirectoryIterator

getFilename(); endforeach; //Näytä tulos var_dump($arFileList); ?> Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIterator Iteraattori tarjoaa käyttöliittymän tiedostojärjestelmän hakemistojen rekursiivista läpikulkua varten. Siinä on useita hyödyllisiä menetelmiä, kuten Ja getChildren() hasLapsia()


RecursiveDirectoryIterator Ja tarjoaa käyttöliittymän tiedostojärjestelmän hakemistojen rekursiivista läpikulkua varten. Siinä on useita hyödyllisiä menetelmiä, kuten. , jotka palauttavat iteraattorin nykyiselle sijainnille, jos se on hakemisto, ja tarkistavat, onko nykyinen aloituspiste hakemisto. getChildren(), "/t\.(txt|css)$/"); $arFileList = array(); foreach($rxIterator nimellä $obFile): $arFileList = $obFile->getFilename(); endforeach; //Näytä tulos var_dump($arFileList); ?> Tulosteessa saamme seuraavan tuloksen: tässä tapauksessa

GlobIterator

getFilename(); endforeach; //Näytä tulos var_dump($arFileList); ?> Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobIterator suorittaa tiedostojen läpikäynnin, joka on samanlainen kuin . Ensimmäinen attribuutti voi sisältää nimikuvion.


Esimerkki havainnollistaa käyttöä GlobIterator samalla tuloksella kuin ennenkin.getFilename(); endforeach; //Näytä tulos var_dump($arFileList); ?> Tulosteessa saamme seuraavan tuloksen: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Johtopäätös

Yllä olevia esimerkkejä tarkasteltiin erilaisia ​​menetelmiä PHP saavuttaa sama tavoite: saada luettelo tiedostoista ja hakemistoista.

Esimerkeistä voidaan korostaa seuraavia pääkohtia: