Sākums / Spēļu konsoles / Php apakšmapēs iegūst pēdējo pievienoto failu. Failu un direktoriju saraksta iegūšana, izmantojot PHP. Izmantojot SPL iteratorus

Php apakšmapēs iegūst pēdējo pievienoto failu. Failu un direktoriju saraksta iegūšana, izmantojot PHP. Izmantojot SPL iteratorus

Šajā nodarbībā mēs aplūkosim tipisku uzdevumu, kas rodas, strādājot pie PHP projekta: failu un direktoriju saraksta iegūšana. Mēs apspriedīsim vairākas pamata un sarežģītākas pieejas, uzskaitot katras priekšrocības un trūkumus. Pirmajos trīs risinājumos tiks izmantotas standarta PHP funkcijas, un pēc tam mēs piedāvāsim spēcīgāku risinājumu, izmantojot SPL iteratorus.

Lai diskutētu par risinājumu un demonstrējumiem pēc būtības, mēs pieņemsim, ka direktoriju struktūra ir šāda:

\---menedžeris | \---lietotājs | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Pamata risinājumi

Pirmā risinājumu kopa ir balstīta uz funkcijas glob() izmantošanu, funkciju opendir() , readdir() un closedir() kombināciju, kā arī funkciju scandir().

Izmantojot glob()

Pirmais risinājums ir balstīts uz funkcijas glob() izmantošanu, kas ļauj meklēt ceļus, izmantojot modeļus. Funkcijai ir divi parametri:

  • $pattern (obligāts): meklēšanas modelis
  • $flags (pēc izvēles): viens vai vairāki karodziņi, kuru apraksti ir atrodami dokumentācijā

Apskatīsim piemērus. Lai meklētu direktorijā visus failus un direktorijus, kuru nosaukumi beidzas ar .txt, jums vajadzētu izmantot kodu:

Ja mēs parādām mainīgo $ filelist, mēs iegūstam:

Masīvs (0 => "raksts.txt", 1 => "teksts.txt")

Ja jums ir nepieciešams to failu un direktoriju saraksts, kuru nosaukumi sākas ar “te”, kods izskatīsies šādi:

Un izvade izskatās šādi:

Masīvs (0 => "test.dat", 1 => "text.txt")

Un, lai iegūtu tikai to direktoriju sarakstu, kuru nosaukumos ir “ma”, izmantojiet kodu:

Pēdējais piemērs izvadīs:

Masīvs (0 => "pārvaldnieks")

Ņemiet vērā, ka pēdējā piemērā kā otrais funkcijas parametrs tiek izmantots karodziņš GLOB_ONLYDIR. Tāpēc fails master.dat tiek izslēgts no saraksta. Lai gan funkcija glob() ir ļoti viegli lietojama, dažreiz tā nav pietiekami elastīga. Piemēram, nav karoga, lai iegūtu tikai failus (nav direktoriju), kas atbilst modelim.

Mēs izmantojam opendir() , readdir() un closedir() .

Otra pieeja failu un direktoriju saraksta iegūšanai, par kuru mēs runāsim, ir izmantot funkcijas opendir() , readdir() un closedir().

Funkcija opendir () atver direktoriju un atgriež savienojuma rokturi. Kad rokturis ir iegūts, var izmantot funkciju readdir (). Ar katru zvanu šī funkcija atgriež nākamā faila vai direktorija nosaukumu atvērtajā direktorijā. Ja visi nosaukumi jau ir uzskaitīti, funkcija atgriežas viltus. Funkcija closedir() tiek izmantota, lai aizvērtu rokturi.

Atšķirībā no funkcijas glob() izmantošanas šī pieeja ir sarežģītāka, jo jums nav parametru, kas palīdzētu filtrēt atgriezto failu un direktoriju nosaukumu sarakstu. Lai iegūtu vēlamos rezultātus, filtrēšana jāveic pašam.

Šis piemērs atgriež failu un direktoriju nosaukumu sarakstu, kas sākas ar “te”:

Palaižot iepriekš minēto kodu, mainīgajā $entry būs iekļauti tādi ieslēgumi kā “”. Un "...". Tie ir divi virtuālie direktoriji, kas pastāv katrā direktorijā failu sistēma. Tie attēlo attiecīgi pašreizējo direktoriju un vecākdirektoriju.

Otrajā piemērā tiek parādīti tikai faili, kas atrodas dotajā direktorijā.

Piemērs radīs sekojošo:

Masīvs (0 => "raksts.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "teksts.txt")

Izmantojot scandir()

Visbeidzot, iepazīstināsim ar funkciju scandir(). Tam ir tikai viens obligātais parametrs: lasīšanas ceļš. Funkcija atgriež failu un direktoriju masīvu, kas atrodas norādītajā ceļā. Lai iegūtu failu un direktoriju sarakstu, pamatojoties uz noteiktu kritēriju, ir jāveic papildu filtrēšana. No otras puses, risinājums ir kodolīgāks un neprasa roktura pārvaldību.

Šajā piemērā parādīts, kā iegūt to failu un direktoriju sarakstu, kuru nosaukumi sākas ar “te”:

Izmantosim SPL iteratorus

Tagad apskatīsim SPL iteratoru izmantošanu. Bet pirms sākam risināt savu problēmu, sniegsim ievadu SPL bibliotēkā un iteratoriem. SPL bibliotēka nodrošina vairākas klases objektorientētām datu struktūrām, iteratoriem, failu deskriptoriem un citiem.

Viena no iteratoru priekšrocībām ir tā, ka tās ir klases un tās var paplašināt, lai tās atbilstu jūsu vajadzībām. Vēl viena priekšrocība ir tā, ka iteratoriem ir savas metodes, kas ir noderīgas daudzu izplatītu problēmu risināšanai un atrodas vienuviet. Apskatiet piemēru FilesystemIterator un readdir() izmantošanai. Abas metodes izmanto cilpu, bet ar readdir() jūs apstrādājat tikai virkni, savukārt FilesystemIterator darbojas ar objektu, kas var saturēt papildu informāciju par failu vai direktoriju (lielumu, īpašnieku, atļaujas utt.).

Protams, PHP nodrošina iespēju iegūt šādu informāciju, izmantojot tādas funkcijas kā fileize() un fileowner(). Bet PHP5 pamatā ir OOP koncepcijas izmantošana. Tāpēc labāk to izmantot modernas metodes darbs ar programmēšanas valodu. Mūsu vietnē ir mācības par darbu ar iteratoriem.

Kā jau minēts apmācības ūdeņainajā daļā, mēs apskatīsim FilesystemIterator, RecursiveDirectoryIterator un GlobIterator izmantošanu. Pirmais tiek mantots no DirectoryIterator, bet pārējais no FilesystemIterator. Viņiem visiem ir viens un tas pats konstruktors, kam nepieciešami divi parametri:

  • $path (obligāts): ceļš uz failu sistēmas ierakstu, ar kuru tiek veiktas darbības
  • $flags (neobligāti): viens vai vairāki karodziņi, kas norādīti dokumentācijā

Šo iteratoru patiesā atšķirība ir tā, kā tie tiek izmantoti, lai pārvietotos pa noteiktu ceļu.

FilesystemIterator

FilesystemIterator izmantošana ir ļoti vienkārša. Redzēsim to darbībā. Mēs piedāvājam divus piemērus. Pirmajā tiek meklēti visi faili un direktoriji, kuru nosaukumi sākas ar “te”. Otrajā piemērā tiek izmantots cits RegexIterator, lai atrastu visus failus un direktorijus, kuru nosaukumi beidzas ar “t.dat” vai “t.php”. RegexIterator tiek izmantots, lai filtrētu rezultātu, pamatojoties uz regulārām izteiksmēm.

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

Iepriekš minētais kods radīs rezultātu, kas līdzīgs iepriekšējiem piemēros.

Otrais piemērs, izmantojot RegexIterator:

getFilename(); )

Tas izvadīs:

Masīvs (0 => "script.php", 1 => "test.dat")

RecursiveDirectoryIterator

RecursiveDirectoryIterator nodrošina saskarni rekursīvai failu sistēmas direktoriju šķērsošanai. Tam ir vairākas noderīgas metodes, piemēram, getChildren() un hasChildren(), kas atgriež pašreizējās atrašanās vietas iteratoru, ja tā ir direktorija, un pārbauda, ​​vai pašreizējais ievades punkts ir direktorijs. Šis piemērs parāda RecursiveDirectoryIterator un getChildren() izmantošanu. Rezultāts būs tāds pats kā iepriekšējos piemēros.

getChildren(), "/t\.(php|dat)$/"); $failu saraksts = masīvs(); foreach($filtrs kā $ieraksts) ( $failu saraksts = $entry->getFilename(); )

GlobIterator

GlobIterator atkārtojas caur failu sistēmu tāpat kā funkcija glob(). Pirmais parametrs var ietvert nosaukuma modeli. Piemērā ir parādīta GlobIterator izmantošana ar tādu pašu rezultātu kā iepriekš.

getFilename(); )

Secinājums

Šī nodarbība parāda dažādu pieeju izmantošanu viena un tā paša mērķa sasniegšanai: failu un direktoriju saraksta iegūšana. Jāatceras šādi galvenie punkti:

  • Funkcija glob() ir iebūvēts risinājums, taču tas nav pietiekami elastīgs.
  • Risinājums, kura pamatā ir opendir() , readdir() un closedir(), ir sarežģītāks un prasa papildu filtrēšanu, taču tas ir elastīgāks.
  • Funkcijai scandir() ir nepieciešama papildu filtrēšana, taču tā darbojas bez roktura apstrādes.
  • Ja izmantojat OOP pieeju, jums vajadzētu izmantot SPL bibliotēku. Turklāt jūs varat paplašināt nodarbības ar savu funkcionalitāti.
  • GlobIterator ir iepriekšēja filtrēšanas funkcija, savukārt citi izmanto RegexIterator.

Reg.ru: domēni un mitināšana

Lielākais reģistrators un mitināšanas pakalpojumu sniedzējs Krievijā.

Tiek izmantoti vairāk nekā 2 miljoni domēna vārdu.

Veicināšana, domēna pasts, biznesa risinājumi.

Vairāk nekā 700 tūkstoši klientu visā pasaulē jau ir izdarījuši savu izvēli.

*Novietojiet peli virs, lai apturētu ritināšanu.

Atpakaļ Uz priekšu

Mapju saraksta iegūšana, izmantojot PHP

Katalogu uzskaitīšana, izmantojot PHP, vai direktoriju uzskaitīšana

Mēs nosauksim direktoriju sarakstu par vispārīgu vaicājumu, kas ģenerē visu vai dažu vecāku direktorija failu un direktoriju sarakstu — process ir līdzīgs rādītāja lapas darbam, ko nodrošina lielākā daļa tīmekļa serveru, bet ar O lielāka kontrole pār tā saturu un formatējumu.

Vēl viena šī skripta priekšrocība ir iespēja veikt noteiktas darbības ar failiem, izmantojot PHP. Jebkurā gadījumā pirmais solis, kas mums jādara, ir failu sistēmas vaicājums - jāatgriež failu un direktoriju saraksts.

Tālāk norādītās funkcijas ļauj iegūt failu nosaukumus un citus rekvizītus no konkrēta direktorija vai rekursīvi atkārtot apakškategorijas.

komentēt: PHP5 ir funkcija skandir, kas "atgriež failu un direktoriju sarakstu direktorijā noteiktā ceļā", taču tas nerāda nekādu papildu informāciju par failiem direktorijā.

Uzskaita vienu direktoriju

Sākumā šeit ir vienkāršas funkcijas piemērs, kas atgriež failu, direktoriju un to rekvizītu sarakstu no viena direktorija (šīs funkcijas uzlabotas versijas atradīsit nedaudz vēlāk šajā nodarbībā.)

lasīt())) ( // izlaist slēptos failus if($entry == ".") turpināt; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ ieraksts/", "izmērs" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("name" = > "$dir$entry", "size" => faila izmērs("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

atgriezties $retval;

) ?>

Varat izmantot šo funkciju šādi:

Atgriešanas vērtība ir asociatīvs failu masīvs, tostarp faila ceļa informācija, lielums un pēdējās modifikācijas datums, ja vien fails nav direktorijs, un tādā gadījumā faila lieluma vietā tiek parādīta virkne "(dir)". 1. piemērs:

",print_r($dirlist),"

Atgriešanas vērtība ir asociatīvs failu masīvs, tostarp faila ceļa informācija, lielums un pēdējās modifikācijas datums, ja vien fails nav direktorijs, un tādā gadījumā faila lieluma vietā tiek parādīta virkne "(dir)"."; /* izvades piemērs Masīvs ( => Masīvs ( => images/background0.jpg => attēls/jpeg => 86920 => 1077461701) => ...) */ ?>

2. piemērs:

"; /* izvades piemērs Masīvs ( => Masīvs ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Failu saraksts, izmantojot HTML Lai lapā iegūtu izvades rezultātus HTML formātā, mēs pārmeklēsim atgriezto masīvu\n"; atbalss "VārdsTips Izmērs Failu saraksts, izmantojot HTML Pēdējā mod. Failu saraksts, izmantojot HTML \n"; foreach($dirlist kā $fails) ( echo " Failu saraksts, izmantojot HTML ($file["nosaukums"]) Failu saraksts, izmantojot HTML Failu saraksts, izmantojot HTML($file["tips"])($file["izmērs"])

\n"; ) atbalss "

  • \n\n"; ?>
  • Šo kodu ir diezgan viegli modificēt, piemēram:
  • - parādīt saraksta rezultātus kā sarakstu, nevis tabulu;
  • - padarīt failu nosaukumus par aktīvām saitēm;

- aizstāt nosaukumus ar ikonām atkarībā no faila veida;

Failu saraksts, izmantojot HTML Lai lapā iegūtu izvades rezultātus HTML formātā, mēs pārmeklēsim atgriezto masīvu\n"; atbalss "VārdsTips utt. Failu saraksts, izmantojot HTML Pēdējā mod. Failu saraksts, izmantojot HTML \n"; foreach($dirlist kā $fails) ( echo " Failu saraksts, izmantojot HTML ($file["nosaukums"]) Failu saraksts, izmantojot HTML Piemēram, lai izvadītu tikai PNG failus, izvades cilpai pievienojiet vienkāršu nosacījumu: Failu saraksts, izmantojot HTML($file["tips"])($file["izmērs"])

\n"; foreach($dirlist kā $fails) ( //pārbaudiet, vai fails ir PNG fails if(!preg_match("/\.png$/", $file["name"])) turpināt; echo " ",date("r", $file["lastmod"]),". Varat arī piemērot papildu nosacījumus atkarībā no faila veida, lieluma vai pēdējās modificēšanas datuma.

Ja vēlaties, piemēram, parādīt sīktēlu, saiti uz lielāku attēlu vai pat video, vienkārši piešķiriet šiem diviem failiem tādus pašus nosaukumus un augstāk esošajā skriptā izmantojiet str_aizvietot vai līdzīga funkcija, lai mainītu saišu saturu.

Rekursīvs direktoriju saraksts

Un, tā kā esam tikuši tik tālu, rekursīvajā sarakstā un apakškategoriju izsaukšanas funkcijā būs tikai nelielas izmaiņas. Pievienojot funkcijai otru parametru, tiek saglabāta iepriekšējā viena direktorija uzskaitīšanas funkcionalitāte.

lasīt())) ( // izlaist slēptos failus if($entry == ".") turpināt; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ ieraksts/", "izmērs" => 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 " => fileize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) $d->close();

atgriezties $retval; ) ?> Lai jaunā funkcionalitāte darbotos, jums jāievada vērtība

taisnība

(vai 1) kā otro parametru.

Pirms skripta atkārtošanas pārbaudiet, vai apakšdirektorijas ir lasāmas, kā arī izlasiet šīs nodarbības pēdējo rindkopu, lai izvairītos no piekļuves kļūdām.

Tāpat kā iepriekš, atgriešanas vērtība ir masīvs, asociatīvais masīvs. Faktiski vienīgais papildinājums ir vēl viena papildu iespēja rekursīvam sarakstam.

lasīt())) ( // izlaist slēptos failus if($entry == ".") turpināt; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ ieraksts/", "izmērs" => 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" => fileize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

atgriezties $retval; ) ?> Tāpat kā iepriekš, mēs pievienojām tikai 1 viltus jauns parametrs

un pāris koda rindiņas. Ja noklusējuma vērtība, kas ir atbildīga par rekursijas dziļumu, nav norādīta, tā tiek iestatīta uz

. Tas ļauj mums būt pārliecinātiem, ka saglabājas iepriekšējās funkcijas un nākamais kods “nepārtrauks”, mainoties funkcijai.

Darbs ar failiem

Programmētājs ļoti bieži saskaras ar nepieciešamību veikt darbības ar failiem. Ja jūsu skripti neizmanto datu bāzes, faili ir vienīgās pieņemamās skripta uzglabāšanas ierīces. Failu izmantošana kā skriptu izpildes informācijas krātuves ļauj tos izmantot dažādās situācijās. Gandrīz visi kaut ko skaitītāju skripti ir rakstīti, pamatojoties uz darbu ar failiem. Ir iespējams minēt arī virkni citu piemēru, taču ir pienācis laiks tieši pāriet no vārdiem pie darbiem.

Es gribu uzreiz teikt, ka darbam ar failu ir jābūt autorizētam. Pēc noklusējuma PHP drošības apsvērumu dēļ neatļauj manipulēt ar failiem. Lai noņemtu šo aizliegumu CuteFTP FTP pārvaldniekā, atzīmējiet visas izvēles rūtiņas faila rekvizītos. fails_eksistē Pirms veicat darbības ar failu, jums bieži ir jāpārliecinās, vai norādītais fails vispār pastāv. To dara funkcija file_exists. Šī funkcija var atgriezt tikai divas vērtības, kā jūs varat iedomāties PATIESA(ja norādītais fails pastāv) un

FALSE

. Parasti šīs funkcijas izmantošana izskatās šādi:

Lūdzu, ņemiet vērā, ka funkcija darbojas tikai ar vietējiem failiem, tas ir, ja vēlaties pārbaudīt, vai Yandex ir ieguvis failu robot.txt, jūsu pūles būs veltīgas. Bet ir iespējams pārbaudīt jebkuru failu, kas atrodas lokālajā serverī, neatkarīgi no tā atrašanās vietas direktorija.

Kā norāda nosaukums, funkcija nosaka faila lielumu un atgriež to baitos. Noderīgi, ja vēlaties pārbaudīt, vai failā ir informācija (kā jūs varētu iedomāties, tukšā failā ir 0 baiti), kā arī ir iespējams pārbaudīt faila lielumu, lai redzētu, vai tas pārsniedz noteiktu ierobežojumu.

failu

Šī funkcija jau darbojas tieši ar failu. Tas atgriež norādītā faila saturu, un tas tiek darīts masīva veidā, kur katrs elements ir faila rinda. Funkcija ir noderīga, ja vienā failā ir jāsaglabā vairākas dažādas vērtības, kurām nevajadzētu krustoties. Pēc tam katra vērtība tiek saglabāta atsevišķā rindā un to nolasa faila funkcija, kas atgriež masīvu, kurā dotajam mainīgajam var piekļūt, nolasot masīva elementa vērtību ar indeksu, kas atbilst faila rindai.

Ir iespējams arī apvienot visus atgrieztā masīva elementus vienā mainīgajā. Tas tiek darīts, izmantojot implode masīva funkciju.

fopen

Ja iepriekšējā funkcija ir autonoma un parasti nav saistīta ar citām funkcijām, tad nākamās funkcijas darbam ar failiem darbojas kopā ar fopen . Šī funkcija atver norādīto failu un atgriež faila savienojuma identifikatoru, kas tiek izmantots pakalpojumu sniegšanai. Šī funkcija nekādā veidā nav saistīta ar faila saturu.

Funkcijai fopen ir vairāki režīmi darbam ar failu. Tie ir norādīti aiz faila nosaukuma un ir šādi:

    "r"
    Fails tiek atvērts tikai tā satura lasīšanai.

    "r+"
    Faila atvēršana gan lasīšanai, gan rakstīšanai.

    "w"
    Fails tiek atvērts rakstīšanas vajadzībām.

    "w+"
    Atveriet failu lasīšanai un rakstīšanai.

    "a"
    Fails tiek atvērts rakstīšanai līdz faila beigām (pievienot).

    "a+"
    Atveras turpmākai rakstīšanai un lasīšanai.

fgets

Funkcija faila lasīšanai, kas atvērts ar funkciju fopen. Taču atšķirībā no faila šī funkcija atgriež tikai vienu faila rindiņu katru reizi, kad tā tiek izpildīta, un tā pārvieto iekšējā faila rādītāju uz nākamo rindiņu, kuru tā nolasīs nākamreiz, kad funkcija tiks izsaukta. Tāpēc, ja nepieciešams lasīt visu failu, šī funkcija ir jāizmanto ciklā.

Ņemiet vērā, ka funkcija fgets izmanto papildu garuma parametru, kas norāda maksimālo nolasāmās faila rindas garumu. Ja virknes izmērs pārsniedz šo skaitli, funkcija to atgriezīs “saīsinātā” formā ar baitu garumu. Pēc noklusējuma šis parametrs ir iestatīts uz 1024 baiti jeb vienu kilobaitu. Īpaši pievērsiet uzmanību šim parametram, ja izmantojat lielus failus, jo, lasot šādus failus, PHP izpildes buferis var pārpildīt (tā lielums ir norādīts konfigurācijas failā), kas novedīs pie iesaldēšanas.

Lūdzu, ņemiet vērā, ka lasāmais fails nav faila nosaukums, bet gan faila savienojuma identifikators, ko atgriež funkcija fopen (mūsu piemērā mainīgā $file vērtība).

fputs

Funkcija ierakstīt informāciju failā, un tas tiek darīts saskaņā ar fgets funkcijas principu, tas ir, tas sāk rakstīt no iekšējā faila rādītāja pozīcijas. Kopumā šī funkcija daudzējādā ziņā ir līdzīga iepriekšminētajai: tā izmanto arī rakstīšanas datu garuma parametru, kas arī nav obligāts.

fclose

Kā jūs varētu uzminēt, šī funkcija aizver norādīto failu. Faktiski pēc skripta pabeigšanas PHP pati aizver visus atvērtos failus, taču labāk to darīt manuāli. Kā funkcijas parametrs ir jānorāda faila savienojuma identifikators.

Lai ilustrētu iepriekš minēto funkciju kombināciju, mēs sniegsim vienkāršu apmeklējumu skaitītāja izveides piemēru.

$fails = fopen("skaitītājs.txt", "r");
$c = fgets($fails, 150);
fclose($ fails);
$c++;
$fails = fopen("skaitītājs.txt", "w");
fputs ($ fails, $ c);
fclose($ fails);
atbalss $c;
?>

Darbs ar direktorijiem

Darbības ar failiem ir cieši saistītas ar direktorijiem. Algoritms darbam ar tiem ir līdzīgs operācijām ar failiem: vispirms ir jāatver direktorijs, jāveic dažas darbības un, visbeidzot, tas jāaizver.

opendir

Šī funkcija atver norādīto direktoriju un atgriež pakalpojuma identifikatoru direktorija savienojumam. Direktoriju ceļi jānorāda šādi:

Punkts nozīmē pašreizējā direktorija atvēršanu

. /faili/

Mapes atvēršana failus atrodas pašreizējā direktorijā

Mapes atvēršana vienu līmeni augstāk par pašreizējo

readdir

Funkcija nolasa direktoriju, ko atver opendir. Katrai caurlaidei tas atgriež faila vai mapes nosaukumu, kas atrodas norādītajā direktorijā, un pārvieto iekšējo rādītāju uz nākamo direktorija objektu. Tātad, lai lasītu visu direktoriju, tas ir jāizmanto cilpā.

Jāņem vērā arī tas, ka šī funkcija atgriež mapju pakalpojumu objektus . Un .. , ko var apgriezt, izvadot IF priekšrakstu.

slēgts

Mēs aizveram direktoriju, kā argumentu norādot mapes savienojuma identifikatoru.

Dažreiz direktoriju funkciju izmantošana padara dzīvi daudz vieglāku. Piemēram, sadaļā Funkcijas varat redzēt funkciju sarakstu alfabētiskā secībā. Vai varat iedomāties, cik daudz laika būtu nepieciešams, lai manuāli uzrakstītu visu sarakstu ar saitēm un pat alfabētiskā secībā. Un šeit man palīdzēja funkcijas darbam ar direktorijiem. Katra funkcija tika ievietota atsevišķā failā ar nosaukumu, kas atbilst funkcijas nosaukumam, bez paplašinājumiem.

Tātad, katru reizi, kad apmeklējat lapu, jūs saņemat tikko ģenerētu funkciju sarakstu.

Tas arī viss. Tiekamies nākamajā nodarbībā.

Direktoriju uzskaitīšana ir process, kurā tiek iegūta informācija par direktorijiem un failiem konkrētajam vecākajam direktorijam, kā arī iespēja šiem datiem lietot dažādus filtrus, lai labotu izvadi.

Šajā piemērā mēs mēģināsim tikt galā ar tipisku uzdevumu, kas parādās gandrīz katrā PHP projekts - direktoriju un/vai failu saraksta iegūšana. Piemērā izmantotas vairākas pamata un sarežģītākas pieejas, izklāstot katras tehnikas plusus un mīnusus. Pirmie trīs risinājumi izmanto standarta PHP funkcijas. Jaunākais uzticamāks risinājums, izmantojot PHP SPL iteratorus.


Lai iegūtu vizuālāku attēlojumu, mēs izmantojam direktoriju struktūru, kas izskatās šādi:


\-Lietojumprogramma | \-Lietotājs | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Pamata risinājumi
Pirmajā piemēru komplektā tiek izmantotas funkcijas glob() un funkciju kombinācijas opendir(), readdir (), slēgts(), kā arī funkcija skandir ().

Izmantojot glob()

Lietošanas piemērs php funkcijas glob(), kas ļauj meklēt ceļu, izmantojot modeli.
Funkcija glob( $raksts,$ karogi) darbojas ar diviem argumentiem:
  • $raksts(obligāti): meklēšanas modeļa virkne
  • $ karogi
    • GLOB_MARK- Katram atgrieztajam direktorijam pievieno slīpsvītru.
    • GLOB_NOSORT- Atgriež failus tādā formā, kādā tie atrodas direktorijā (bez šķirošanas). Ja šis karodziņš nav norādīts, nosaukumi tiek sakārtoti alfabētiskā secībā.
    • GLOB_NOCHECK- Atgriež meklēšanas modeli, ja, izmantojot to, netika atrasts neviens fails.
    • GLOB_NOESCAPE- Svītras slīpsvītras neietver meta rakstzīmes.
    • GLOB_BRACE- Izvērš (a,b,c), lai atbilstu "a", "b" vai "c".
    • GLOB_ONLYDIR- Atgriež tikai tos direktorijus, kas atbilst modelim.
    • GLOB_ERR- Aptur lasīšanas kļūdas (piemēram, direktorijus bez lasīšanas atļaujas), pēc noklusējuma kļūdas tiek ignorētas.
Lai direktorijā meklētu visus failus un direktorijus, kuru nosaukumi beidzas ar .txt, izmantojiet šādu kodu:Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Ja jums ir nepieciešams iegūt failu un direktoriju sarakstu, kuru nosaukumi sākas ar "te":Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(9) "test.html" => string(7) "test.js" ) Iegūstam tikai direktorijus, kuru nosaukumos sarakstā ir "er":Izvadā mēs iegūstam šādu rezultātu: masīvs(1) ( => string(4) "Lietotājs" )

Pēdējā piemērā tiek izmantots karogs GLOB_ONLYDIR kā otrais funkcijas arguments. Tāpēc sarakstā tika iekļauts tikai nosaukumā esošais direktorijs “Lietotājs”, kurā ir “er”. Funkciju glob() ir ļoti viegli lietot, taču dažreiz tā nav pietiekami elastīga. Nav karoga, lai iegūtu tikai failus (nav direktoriju), kas atbilst modelim.

Izmantojot opendir (), readdir () un closedir ().

Nākamā metode failu un direktoriju saraksta iegūšanai ir PHP funkciju izmantošana opendir(), readdir () Un slēgts().

Funkcija opendir() atgriež rokturi atvērtajā direktorijā. Kad rokturis ir saņemts, varat izmantot funkciju readdir (). Piekļūstot rokturim, funkcija readdir () parāda nākamā faila vai direktorija nosaukumu. Ja visi deskriptorā ietvertie elementi jau ir uzskaitīti, funkcija readdir () atgriezīsies viltus. Lai aizvērtu deskriptoru, mēs izmantojam funkciju slēgts().


Atšķirībā no php funkcijas izmantošanas , šī pieeja ir nedaudz sarežģītāka. Nav iespējams iestatīt filtrēšanas parametrus, kas palīdz ģenerēt atgriezto failu un direktoriju nosaukumu sarakstu iepriekš. Lai iegūtu nepieciešamo failu un direktoriju sarakstu, filtrēšana jāveic neatkarīgi.


Šis piemērs atgriež failu un direktoriju nosaukumu sarakstu, kas sākas ar "Us":Izvade būs: masīvs(1) ( => string(4) "Lietotājs" ) Šis piemērs izvadīs tikai tos failus, kas atrodas dotajā direktorijā.Izvadā mēs iegūstam šādu rezultātu: masīvs(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => string(10) "readme.txt")

Izmantojot scandir().

Lai pabeigtu, apskatīsim php funkcijas izmantošanas piemēru skandir (). Tam ir tikai viens obligātais atribūts - ceļš uz lasīšanas direktoriju. Funkcijas rezultāts ir failu un direktoriju masīvs, kas atrodas pa argumentā norādīto ceļu. Tāpat kā iepriekšējā piemērā, lai iegūtu filtrētu failu un direktoriju sarakstu, tas ir jāpalaiž pašam. Vizuāli risinājums ir īsāks un nav nepieciešama deskriptora pārvaldība.


Piemērā parādīts, kā iegūt to failu un direktoriju sarakstu, kuru nosaukumi sākas ar "te":Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(9) "test.html" => string(7) "test.js" )

Uzlabots risinājums, izmantojot PHP SPL
Uzticamāks risinājums, izmantojot SPL iteratorus FilesystemIterator, RecursiveDirectoryIterator Un GlobIterator.

Izmantojot SPL iteratorus.

Apskatīsim SPL iteratoru izmantošanu. Pirms sākam risināt problēmu, nedaudz iepazīsimies ar PHP SPL bibliotēku un iteratoriem. SPL bibliotēka nodrošina specializētas klašu kopas objektorientētām datu struktūrām, iteratoriem, failu deskriptoriem un citiem.


Galvenā iteratoru priekšrocība ir tā, ka tās ir klases un tās var paplašināt, izmantojot standarta mehānismu php mantojums klasēm. Vēl viens pluss ir tas, ka iteratoriem ir savas metodes, kas var būt noderīgas izplatītu problēmu risināšanā, un tās visas atrodas vienuviet. Apskatīsim lietošanas piemēru FilesystemIterator un salīdzināt ar readdir (). Abas metodes izmanto cilpu, bet gadījumā readdir () būs iespējams apstrādāt tikai virkni, bet FilesystemIterator var strādāt ar objektu. Kurā var būt ietverta papildu informācija par failu vai direktoriju, piemēram, īpašnieks, izmērs, piekļuves tiesības utt.


Protams, PHP ir iespēja iegūt šo informāciju, izmantojot funkcijas, faila izmērs (), faila īpašnieks () un citi. Bet PHP, tāpat kā jebkurai programmēšanas valodai, ir iespēja mainīties. PHP5 ir arvien lielāka vēlme izmantot OOP koncepcijas. Tāpēc labāk ir izmantot modernas metodes darbam ar programmēšanas valodu.


Apsveriet iespēju izmantot FilesystemIterator, RecursiveDirectoryIterator Un GlobIterator. Pirmais iterators manto no DirectoryIterator, un pārējais no FilesystemIterator. Viņiem visiem ir viens un tas pats konstruktors, kam ir divi argumenti:

  • $ceļš(obligāti): ceļš uz failu sistēmas vienumu, ar kuru tiek veiktas darbības
  • $ karogi(pēc izvēles): viens vai vairāki karodziņi
    • FilesystemIterator::CURRENT_AS_PATHNAME Izraisa FilesystemIterator::current() metodi, lai atgrieztu ceļu.
    • FilesystemIterator::CURRENT_AS_FILEINFO Izraisa FilesystemIterator::current() metodi, lai atgrieztu SplFileInfo gadījumu.
    • FilesystemIterator::CURRENT_AS_SELF Izraisa FilesystemIterator::current() metodi, lai atgrieztu $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Maskas FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Izraisa FilesystemIterator::key() metodi, lai atgrieztu ceļu.
    • FilesystemIterator::KEY_AS_FILENAME Izraisa FilesystemIterator::key() metodi, lai atgrieztu faila nosaukumu.
    • FilesystemIterator::FOLLOW_SYMLINKS Piespiež RecursiveDirectoryIterator::hasChildren() metodi sekot simboliskām saitēm.
    • FilesystemIterator::KEY_MODE_MASK Maskas FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Tāds pats kā FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Izlaiž punktu failus (. un ..).
    • FilesystemIterator::UNIX_PATHS Piespiež visus ceļus izmantot Unix stila slīpsvītras neatkarīgi no sistēmas noklusējuma iestatījumiem.

Šo iteratoru atšķirība ir tā, kā tie tiek izmantoti, lai pārvietotos pa noteiktu ceļu.

FilesystemIterator

Izmantot FilesystemIteratorļoti vienkārši.
Piemērā ir parādīta visu failu un direktoriju meklēšana, kuru nosaukumi sākas ar "te".

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

endifs; endforeach; //Parādīt rezultātu var_dump($arFileList); ?> Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(7) "test.js" => string(9) "test.html" ) Piemērs cita iteratora izmantošanai RegexIterator Piemērs cita iteratora izmantošanai lai meklētu visus failus un direktorijus, kuru nosaukumi beidzas ar "t.js" vai "t.php". Iterators

tiek izmantots, lai filtrētu rezultātu, un tiek izmantots regulārās izteiksmes dzinējs.

RecursiveDirectoryIterator

getFilename(); endforeach; //Parādīt rezultātu var_dump($arFileList); ?> Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIterator Iterators nodrošina saskarni failu sistēmas direktoriju rekursīvai šķērsošanai. Tam ir vairākas noderīgas metodes, piemēram Un getChildren() ir bērni ()


RecursiveDirectoryIterator Un nodrošina saskarni failu sistēmas direktoriju rekursīvai šķērsošanai. Tam ir vairākas noderīgas metodes, piemēram. , kas atgriež pašreizējās atrašanās vietas iteratoru, ja tas ir direktorijs, un pārbauda, ​​vai pašreizējais ievades punkts ir direktorijs. getChildren(), "/t\.(txt|css)$/"); $arFileList = masīvs(); foreach($rxIterator kā $obFile): $arFileList = $obFile->getFilename(); endforeach; //Parādīt rezultātu var_dump($arFileList); ?> Izvadē mēs iegūstam šādu rezultātu:šajā gadījumā

GlobIterator

getFilename(); endforeach; //Parādīt rezultātu var_dump($arFileList); ?> Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobIterator veic failu pārvietošanu, kas ir līdzīga . Pirmais atribūts var ietvert nosaukuma modeli.


Piemērs parāda izmantošanu GlobIterator ar tādu pašu rezultātu kā iepriekš.getFilename(); endforeach; //Parādīt rezultātu var_dump($arFileList); ?> Izvadā mēs iegūstam šādu rezultātu: masīvs(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Secinājums

Iepriekš minētie piemēri tika ņemti vērā dažādas metodes PHP, lai sasniegtu to pašu mērķi: iegūt failu un direktoriju sarakstu.

No piemēriem var izcelt šādus galvenos punktus: