Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Interesante
  • Marrja e një liste skedarësh dhe drejtorish duke përdorur PHP. Scandir - Merr një listë të skedarëve dhe drejtorive të vendosura në një rrugë të caktuar, listimi i skedarëve Php në një drejtori

Marrja e një liste skedarësh dhe drejtorish duke përdorur PHP. Scandir - Merr një listë të skedarëve dhe drejtorive të vendosura në një rrugë të caktuar, listimi i skedarëve Php në një drejtori

Në këtë mësim do të merremi me një detyrë tipike që lind gjatë punës në një projekt PHP: marrja e një liste skedarësh dhe drejtorish. Ne do të diskutojmë disa qasje themelore dhe më të sofistikuara, duke renditur të mirat dhe të këqijat e secilës. Tre zgjidhjet e para do të përdorin funksione standarde PHP, dhe më pas do të prezantojmë një më të fortë duke përdorur përsëritësit SPL.

Për diskutim thelbësor të zgjidhjes dhe demonstrimeve, ne do të supozojmë se struktura e drejtorisë është si më poshtë:

\---menaxher | \---përdoruesi | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Zgjidhjet bazë

Grupi i parë i zgjidhjeve bazohet në përdorimin e funksionit glob(), një kombinim të funksioneve opendir() , readdir() dheclosedir() dhe gjithashtu funksionin scandir().

Duke përdorur glob()

Zgjidhja e parë bazohet në përdorimin e funksionit glob(), i cili ju lejon të kërkoni për shtigje duke përdorur modele. Funksioni ka dy parametra:

  • $pattern (kërkohet): modeli i kërkimit
  • $flags (opsionale): një ose më shumë flamuj, përshkrimet e të cilëve mund të gjenden në dokumentacion

Le të shohim shembuj. Për të kërkuar një drejtori për të gjithë skedarët dhe drejtoritë, emrat e të cilëve përfundojnë me .tekst, duhet të përdorni kodin:

Nëse shfaqim variablin $filelist, marrim:

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

Nëse keni nevojë për një listë të skedarëve dhe drejtorive, emrat e të cilëve fillojnë me "te", atëherë kodi do të duket si ky:

Dhe dalja duket si kjo:

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

Dhe për të marrë një listë të drejtorive vetëm me emra që përmbajnë "ma", përdorni kodin:

Shembulli i fundit do të dalë:

Array (0 => "menaxher")

Vini re se shembulli i fundit përdor flamurin GLOB_ONLYDIR si parametër të dytë të funksionit. Prandaj, skedari master.dat është i përjashtuar nga lista. Megjithëse funksioni glob() është shumë i lehtë për t'u përdorur, ndonjëherë ai nuk është mjaft fleksibël. Për shembull, nuk ka asnjë flamur për të marrë vetëm skedarë (pa drejtori) që përputhen me modelin.

Ne përdorim opendir() , readdir() dheclosedir().

Qasja e dytë për marrjen e një liste skedarësh dhe drejtorish që do të diskutojmë është përdorimi i funksioneve opendir(), readdir() dheclosedir().

Funksioni opendir() hap një direktori dhe kthen një dorezë lidhjeje. Pasi të merret doreza, mund të përdoret funksioni readdir(). Me çdo thirrje, ky funksion kthen emrin e skedarit ose drejtorisë tjetër brenda drejtorisë së hapur. Nëse të gjithë emrat janë renditur tashmë, funksioni kthehet i rremë. Funksioni closeir() përdoret për të mbyllur dorezën.

Ndryshe nga përdorimi i funksionit glob(), kjo qasje është më komplekse sepse nuk keni parametra për të ndihmuar në filtrimin e listës së emrave të skedarëve dhe drejtorive të kthyera. Ju duhet ta bëni vetë filtrimin për të marrë rezultatet që dëshironi.

Shembulli i mëposhtëm kthen një listë të emrave të skedarëve dhe drejtorive që fillojnë me "te":

Kur ekzekutoni kodin e mësipërm, ndryshorja $entry do të përmbajë përfshirje të tilla si "." Dhe "...". Këto janë dy drejtori virtuale që ekzistojnë në çdo drejtori të sistemit të skedarëve. Ata përfaqësojnë përkatësisht direktorinë aktuale dhe direktorinë prind.

Shembulli i dytë shfaq vetëm skedarët që gjenden në drejtorinë e dhënë.

Shembulli do të prodhojë sa vijon:

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

Duke përdorur scandir ()

Së fundi, le të prezantojmë funksionin scandir(). Ai ka vetëm një parametër të kërkuar: rrugën e leximit. Funksioni kthen një grup skedarësh dhe drejtorish të vendosura në shtegun e specifikuar. Për të marrë një listë skedarësh dhe drejtorish bazuar në një kriter specifik, duhet të kryeni filtrim shtesë. Nga ana tjetër, zgjidhja është më koncize dhe nuk kërkon menaxhim të dorezës.

Ky shembull tregon se si të merrni një listë të skedarëve dhe drejtorive, emrat e të cilëve fillojnë me "te":

Le të përdorim përsëritësit SPL

Tani le të shohim përdorimin e përsëritësve SPL. Por përpara se të fillojmë të zgjidhim problemin tonë, le të bëjmë një hyrje për bibliotekën SPL dhe përsëritësit. Biblioteka SPL ofron një seri klasash për strukturat e të dhënave të orientuara nga objekti, përsëritësit, përshkruesit e skedarëve dhe më shumë.

Një nga përfitimet e iteratorëve është se ato janë klasa dhe mund të zgjerohen për t'iu përshtatur nevojave tuaja. Një avantazh tjetër është se përsëritësit kanë metodat e tyre, të cilat janë të dobishme për zgjidhjen e shumë problemeve të zakonshme dhe janë të vendosura në një vend. Shikoni një shembull të përdorimit të FilesystemIterator kundrejt readdir(). Të dyja metodat përdorin një lak, por me readdir() përpunoni vetëm një varg, ndërsa FilesystemIterator punon me një objekt që mund të përmbajë informacion shtesë rreth skedarit ose drejtorisë (madhësia, pronari, lejet, etj.).

Sigurisht, PHP ofron mundësinë për të marrë një informacion të tillë duke përdorur funksione të tilla si file size() dhe fileowner(). Por PHP5 bazohet në përdorimin e konceptit OOP. Prandaj, është më mirë të përdorni metoda moderne të punës me një gjuhë programimi. Në faqen tonë të internetit ka mësime për të punuar me iteratorët.

Siç është thënë tashmë në pjesën ujore të tutorialit, ne do të mbulojmë përdorimin e FilesystemIterator, RecursiveDirectoryIterator dhe GlobIterator. E para trashëgon nga DirectoryIterator dhe pjesa tjetër nga FilesystemIterator. Ata të gjithë kanë të njëjtin konstruktor, i cili merr dy parametra:

  • $rruga (kërkohet): shteg për hyrjen e sistemit të skedarëve në të cilin kryhen operacionet
  • $flags (opsionale): një ose më shumë flamuj të listuar në dokumentacion

Dallimi i vërtetë në këta përsëritës është se si ato përdoren për të lundruar në një shteg të caktuar.

FilesystemIterator

Përdorimi i FilesystemIterator është shumë i thjeshtë. Le ta shohim në veprim. Po paraqesim dy shembuj. E para tregon një kërkim për të gjithë skedarët dhe drejtoritë, emrat e të cilëve fillojnë me "te". Shembulli i dytë përdor një tjetër RegexIterator për të gjetur të gjithë skedarët dhe drejtoritë, emrat e të cilëve mbarojnë me "t.dat" ose "t.php". RegexIterator përdoret për të filtruar rezultatin bazuar në shprehje të rregullta.

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

Kodi i mësipërm do të prodhojë një rezultat të ngjashëm me shembujt e mëparshëm.

Shembulli i dytë duke përdorur RegexIterator:

getfilename(); )

Do të nxjerrë:

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

RecursiveDirectoryIterator

RecursiveDirectoryIterator ofron një ndërfaqe për kalimin rekurziv të drejtorive të sistemit të skedarëve. Ka disa metoda të dobishme, të tilla si getChildren() dhe hasChildren(), të cilat kthejnë një përsëritës për vendndodhjen aktuale nëse është një direktori, dhe kontrollojnë nëse pika aktuale e hyrjes është një direktori. Shembulli i mëposhtëm demonstron përdorimin e RecursiveDirectoryIterator dhe getChildren(). Rezultati do të jetë i njëjtë si në shembujt e mëparshëm.

getChildren(), "/t\.(php|dat)$/"); $filelist = grup(); foreach ($filtro si $hyrje) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator përsëritet përmes sistemit të skedarëve në të njëjtën mënyrë si funksioni glob(). Parametri i parë mund të përfshijë një shabllon për emrin. Shembulli demonstron përdorimin e GlobIterator me të njëjtin rezultat si më parë.

getfilename(); )

konkluzioni

Ky mësim demonstron përdorimin e qasjeve të ndryshme për të arritur të njëjtin qëllim: marrjen e një liste skedarësh dhe drejtorish. Duhet të mbani mend pikat kryesore të mëposhtme:

  • Funksioni glob() është një zgjidhje e integruar, por nuk është mjaft fleksibël.
  • Një zgjidhje e bazuar në opendir() , readdir() dheclosedir() është më komplekse dhe kërkon filtrim shtesë, por është më fleksibël.
  • Funksioni scandir() kërkon filtrim shtesë, por funksionon pa përpunuar dorezën.
  • Nëse jeni duke përdorur një qasje OOP, atëherë duhet të përdorni bibliotekën SPL. Për më tepër, ju mund të zgjeroni klasat me funksionalitetin tuaj.
  • GlobIterator ka një veçori para-filtrimi, ndërsa të tjerët përdorin RegexIterator.

Në këtë mësim do të merremi me një detyrë tipike që lind gjatë punës në një projekt PHP: marrja e një liste skedarësh dhe drejtorish. Ne do të diskutojmë disa qasje themelore dhe më të sofistikuara, duke renditur të mirat dhe të këqijat e secilës. Tre zgjidhjet e para do të përdorin funksione standarde PHP, dhe më pas do të prezantojmë një më të fortë duke përdorur përsëritësit SPL.

Për diskutim thelbësor të zgjidhjes dhe demonstrimeve, ne do të supozojmë se struktura e drejtorisë është si më poshtë:

\---menaxher | \---përdoruesi | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Zgjidhjet bazë

Grupi i parë i zgjidhjeve bazohet në përdorimin e funksionit glob(), një kombinim të funksioneve opendir() , readdir() dheclosedir() dhe gjithashtu funksionin scandir().

Duke përdorur glob()

Zgjidhja e parë bazohet në përdorimin e funksionit glob(), i cili ju lejon të kërkoni për shtigje duke përdorur modele. Funksioni ka dy parametra:

  • $pattern (kërkohet): modeli i kërkimit
  • $flags (opsionale): një ose më shumë flamuj, përshkrimet e të cilëve mund të gjenden në dokumentacion

Le të shohim shembuj. Për të kërkuar një drejtori për të gjithë skedarët dhe drejtoritë, emrat e të cilëve përfundojnë me .tekst, duhet të përdorni kodin:

Nëse shfaqim variablin $filelist, marrim:

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

Nëse keni nevojë për një listë të skedarëve dhe drejtorive, emrat e të cilëve fillojnë me "te", atëherë kodi do të duket si ky:

Dhe dalja duket si kjo:

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

Dhe për të marrë një listë të drejtorive vetëm me emra që përmbajnë "ma", përdorni kodin:

Shembulli i fundit do të dalë:

Array (0 => "menaxher")

Vini re se shembulli i fundit përdor flamurin GLOB_ONLYDIR si parametër të dytë të funksionit. Prandaj, skedari master.dat është i përjashtuar nga lista. Megjithëse funksioni glob() është shumë i lehtë për t'u përdorur, ndonjëherë ai nuk është mjaft fleksibël. Për shembull, nuk ka asnjë flamur për të marrë vetëm skedarë (pa drejtori) që përputhen me modelin.

Ne përdorim opendir() , readdir() dheclosedir().

Qasja e dytë për marrjen e një liste skedarësh dhe drejtorish që do të diskutojmë është përdorimi i funksioneve opendir(), readdir() dheclosedir().

Funksioni opendir() hap një direktori dhe kthen një dorezë lidhjeje. Pasi të merret doreza, mund të përdoret funksioni readdir(). Me çdo thirrje, ky funksion kthen emrin e skedarit ose drejtorisë tjetër brenda drejtorisë së hapur. Nëse të gjithë emrat janë renditur tashmë, funksioni kthehet i rremë. Funksioni closeir() përdoret për të mbyllur dorezën.

Ndryshe nga përdorimi i funksionit glob(), kjo qasje është më komplekse sepse nuk keni parametra për të ndihmuar në filtrimin e listës së emrave të skedarëve dhe drejtorive të kthyera. Ju duhet ta bëni vetë filtrimin për të marrë rezultatet që dëshironi.

Shembulli i mëposhtëm kthen një listë të emrave të skedarëve dhe drejtorive që fillojnë me "te":

Kur ekzekutoni kodin e mësipërm, ndryshorja $entry do të përmbajë përfshirje të tilla si "." Dhe "...". Këto janë dy drejtori virtuale që ekzistojnë në çdo drejtori të sistemit të skedarëve. Ata përfaqësojnë përkatësisht direktorinë aktuale dhe direktorinë prind.

Shembulli i dytë shfaq vetëm skedarët që gjenden në drejtorinë e dhënë.

Shembulli do të prodhojë sa vijon:

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

Duke përdorur scandir ()

Së fundi, le të prezantojmë funksionin scandir(). Ai ka vetëm një parametër të kërkuar: rrugën e leximit. Funksioni kthen një grup skedarësh dhe drejtorish të vendosura në shtegun e specifikuar. Për të marrë një listë skedarësh dhe drejtorish bazuar në një kriter specifik, duhet të kryeni filtrim shtesë. Nga ana tjetër, zgjidhja është më koncize dhe nuk kërkon menaxhim të dorezës.

Ky shembull tregon se si të merrni një listë të skedarëve dhe drejtorive, emrat e të cilëve fillojnë me "te":

Le të përdorim përsëritësit SPL

Tani le të shohim përdorimin e përsëritësve SPL. Por përpara se të fillojmë të zgjidhim problemin tonë, le të bëjmë një hyrje për bibliotekën SPL dhe përsëritësit. Biblioteka SPL ofron një seri klasash për strukturat e të dhënave të orientuara nga objekti, përsëritësit, përshkruesit e skedarëve dhe më shumë.

Një nga përfitimet e iteratorëve është se ato janë klasa dhe mund të zgjerohen për t'iu përshtatur nevojave tuaja. Një avantazh tjetër është se përsëritësit kanë metodat e tyre, të cilat janë të dobishme për zgjidhjen e shumë problemeve të zakonshme dhe janë të vendosura në një vend. Shikoni një shembull të përdorimit të FilesystemIterator kundrejt readdir(). Të dyja metodat përdorin një lak, por me readdir() përpunoni vetëm një varg, ndërsa FilesystemIterator punon me një objekt që mund të përmbajë informacion shtesë rreth skedarit ose drejtorisë (madhësia, pronari, lejet, etj.).

Sigurisht, PHP ofron mundësinë për të marrë një informacion të tillë duke përdorur funksione të tilla si file size() dhe fileowner(). Por PHP5 bazohet në përdorimin e konceptit OOP. Prandaj, është më mirë të përdorni metoda moderne të punës me një gjuhë programimi. Në faqen tonë të internetit ka mësime për të punuar me iteratorët.

Siç është thënë tashmë në pjesën ujore të tutorialit, ne do të mbulojmë përdorimin e FilesystemIterator, RecursiveDirectoryIterator dhe GlobIterator. E para trashëgon nga DirectoryIterator dhe pjesa tjetër nga FilesystemIterator. Ata të gjithë kanë të njëjtin konstruktor, i cili merr dy parametra:

  • $rruga (kërkohet): shteg për hyrjen e sistemit të skedarëve në të cilin kryhen operacionet
  • $flags (opsionale): një ose më shumë flamuj të listuar në dokumentacion

Dallimi i vërtetë në këta përsëritës është se si ato përdoren për të lundruar në një shteg të caktuar.

FilesystemIterator

Përdorimi i FilesystemIterator është shumë i thjeshtë. Le ta shohim në veprim. Po paraqesim dy shembuj. E para tregon një kërkim për të gjithë skedarët dhe drejtoritë, emrat e të cilëve fillojnë me "te". Shembulli i dytë përdor një tjetër RegexIterator për të gjetur të gjithë skedarët dhe drejtoritë, emrat e të cilëve mbarojnë me "t.dat" ose "t.php". RegexIterator përdoret për të filtruar rezultatin bazuar në shprehje të rregullta.

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

Kodi i mësipërm do të prodhojë një rezultat të ngjashëm me shembujt e mëparshëm.

Shembulli i dytë duke përdorur RegexIterator:

getfilename(); )

Do të nxjerrë:

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

RecursiveDirectoryIterator

RecursiveDirectoryIterator ofron një ndërfaqe për kalimin rekurziv të drejtorive të sistemit të skedarëve. Ka disa metoda të dobishme, të tilla si getChildren() dhe hasChildren(), të cilat kthejnë një përsëritës për vendndodhjen aktuale nëse është një direktori, dhe kontrollojnë nëse pika aktuale e hyrjes është një direktori. Shembulli i mëposhtëm demonstron përdorimin e RecursiveDirectoryIterator dhe getChildren(). Rezultati do të jetë i njëjtë si në shembujt e mëparshëm.

getChildren(), "/t\.(php|dat)$/"); $filelist = grup(); foreach ($filtro si $hyrje) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator përsëritet përmes sistemit të skedarëve në të njëjtën mënyrë si funksioni glob(). Parametri i parë mund të përfshijë një shabllon për emrin. Shembulli demonstron përdorimin e GlobIterator me të njëjtin rezultat si më parë.

getfilename(); )

konkluzioni

Ky mësim demonstron përdorimin e qasjeve të ndryshme për të arritur të njëjtin qëllim: marrjen e një liste skedarësh dhe drejtorish. Duhet të mbani mend pikat kryesore të mëposhtme:

  • Funksioni glob() është një zgjidhje e integruar, por nuk është mjaft fleksibël.
  • Një zgjidhje e bazuar në opendir() , readdir() dheclosedir() është më komplekse dhe kërkon filtrim shtesë, por është më fleksibël.
  • Funksioni scandir() kërkon filtrim shtesë, por funksionon pa përpunuar dorezën.
  • Nëse jeni duke përdorur një qasje OOP, atëherë duhet të përdorni bibliotekën SPL. Për më tepër, ju mund të zgjeroni klasat me funksionalitetin tuaj.
  • GlobIterator ka një veçori para-filtrimi, ndërsa të tjerët përdorin RegexIterator.

Puna me skedarë

Nevoja për operacione me skedarë përballet shumë shpesh me programuesin. Nëse skriptet tuaja nuk përdorin baza të të dhënave, atëherë skedarët janë të vetmet pajisje ruajtëse të pranueshme për skriptin. Përdorimi i skedarëve si depo të informacionit të ekzekutimit të skriptit i lejon ato të përdoren në një shumëllojshmëri të gjerë situatash. Pothuajse të gjitha skriptet e kundërta për diçka shkruhen bazuar në punën me skedarë. Është gjithashtu e mundur të jepen një mori shembujsh të tjerë, por është koha për të kaluar drejtpërdrejt nga fjalët në veprim.

Dua të them menjëherë se puna me dosjen duhet të autorizohet. Si parazgjedhje, PHP nuk lejon manipulimin e skedarëve për arsye sigurie. Për të hequr këtë ndalim në menaxherin FTP CuteFTP, kontrolloni të gjitha kutitë në vetitë e skedarit; menaxherët e tjerë duhet të kenë diçka të ngjashme.

skedari_ekziston

Përpara se të kryeni veprime në një skedar, shpesh duhet të siguroheni që skedari i specifikuar ekziston. Kjo është ajo që bën funksioni file_exists. Ky funksion mund të kthejë vetëm dy vlera, siç mund ta imagjinoni E VËRTETË(nëse ekziston skedari i specifikuar) dhe I RREMË. Në mënyrë tipike, përdorimi i këtij funksioni duket si ky:

Ju lutemi vini re se funksioni funksionon vetëm në skedarët lokalë, domethënë nëse dëshironi të kontrolloni nëse Yandex ka blerë një skedar robot.txt, atëherë përpjekjet tuaja do të jenë të kota. Por është e mundur të kontrolloni çdo skedar të vendosur në serverin lokal, pavarësisht nga drejtoria e vendndodhjes së tij.

Këtu janë disa rregulla për të përshkruar rrugën drejt një skedari.

madhësia e skedarit

Siç sugjeron emri, funksioni përcakton madhësinë e skedarit dhe e kthen atë në bajt. E dobishme nëse doni të kontrolloni një skedar për të parë nëse ai përmban informacion (siç mund ta imagjinoni, një skedar bosh përmban 0 bajt), dhe është gjithashtu e mundur të kontrolloni madhësinë e skedarit për të parë nëse tejkalon një kufi të caktuar.

dosje

Ky funksion tashmë funksionon drejtpërdrejt me skedarin. Ai kthen përmbajtjen e skedarit të specifikuar dhe këtë e bën në formën e një grupi, ku çdo element është një rresht i skedarit. Funksioni është i dobishëm kur ju duhet të ruani disa vlera të ndryshme në një skedar që nuk duhet të kryqëzohen. Pastaj secila vlerë ruhet në një rresht të veçantë dhe lexohet nga funksioni skedar, i cili kthen një grup, në mënyrë që ndryshorja e dhënë të aksesohet duke lexuar vlerën e elementit të grupit me indeksin që i përgjigjet rreshtit në skedar.

Është gjithashtu e mundur të ribashkohen të gjithë elementët e grupit të kthyer në një ndryshore të vetme. Kjo bëhet duke përdorur funksionin e grupit implode.

fopen

Nëse funksioni i mëparshëm është i pavarur dhe në përgjithësi nuk lidhet me funksione të tjera, atëherë funksionet e mëvonshme për të punuar me skedarë funksionojnë së bashku me fopen. Ky funksion hap skedarin e specifikuar dhe kthen identifikuesin e lidhjes së skedarit, i cili përdoret për qëllime shërbimi. Ky funksion nuk lidhet në asnjë mënyrë me përmbajtjen e skedarit.

Funksioni fopen ka disa mënyra për të punuar me një skedar. Ato tregohen pas emrit të skedarit dhe janë si më poshtë:

    "r"
    Skedari hapet vetëm për të lexuar përmbajtjen e tij.

    "r+"
    Hapja e një skedari për lexim dhe shkrim.

    "w"
    Skedari hapet për qëllime shkrimi.

    "w +"
    Hapni skedarin për lexim dhe shkrim.

    "a"
    Skedari hapet për shkrim deri në fund të skedarit (shtoj).

    "a +"
    Hapet për shkrim dhe lexim të mëtejshëm.

fgets

Funksioni për leximin e një skedari të hapur nga funksioni fopen. Por ndryshe nga skedari, ky funksion kthen vetëm një rresht të skedarit sa herë që ekzekutohet dhe e zhvendos treguesin e brendshëm të skedarit në rreshtin tjetër, të cilin do ta lexojë herën tjetër që të thirret funksioni. Prandaj, nëse duhet të lexoni të gjithë skedarin, duhet ta përdorni këtë funksion në një lak.

Vini re se funksioni fgets përdor një parametër shtesë të gjatësisë, i cili specifikon gjatësinë maksimale të një linje skedari për t'u lexuar. Nëse madhësia e vargut e kalon këtë numër, atëherë funksioni do ta kthejë atë në një formë "të shkurtuar" të bajteve të gjatësisë. Si parazgjedhje, ky parametër është vendosur në 1024 byte, ose një kilobajt. Veçanërisht i kushtoni vëmendje këtij parametri nëse përdorni skedarë të mëdhenj, pasi kur lexoni skedarë të tillë, buferi i ekzekutimit PHP mund të tejmbushet (madhësia e tij tregohet në skedarin e konfigurimit), gjë që do të çojë në një ngrirje.

Vini re se skedari për të lexuar nuk është emri i skedarit, por identifikuesi i lidhjes së skedarit i kthyer nga funksioni fopen (në shembullin tonë, vlera e ndryshores $file).

fputs

Funksioni i shkrimit të informacionit në një skedar, dhe këtë e bën sipas parimit të funksionimit të funksionit fgets, domethënë fillon të shkruajë nga pozicioni i treguesit të skedarit të brendshëm. Në përgjithësi, ky funksion është në shumë mënyra i ngjashëm me sa më sipër: ai përdor gjithashtu parametrin e gjatësisë së të dhënave të shkrimit, i cili është gjithashtu opsional.

fclose

Siç mund ta keni marrë me mend, ky funksion mbyll skedarin e specifikuar. Në fakt, pas përfundimit të skriptit, vetë PHP mbyll të gjithë skedarët e hapur, por është akoma më mirë ta bëni këtë me dorë. Si parametër funksioni, duhet të specifikoni identifikuesin e lidhjes së skedarit.

Për të ilustruar kombinimin e funksioneve të mësipërme, do të japim një shembull të krijimit të një numëruesi të thjeshtë vizitash.

$file = fopen("counter.txt", "r");
$c = fgets ($file, 150);
fclose($file);
$c++;
$file = fopen("counter.txt", "w");
fputs ($file, $c);
fclose($file);
jehonë $c;
?>

Puna me drejtoritë

Të lidhura ngushtë me veprimet në skedarë janë operacionet në drejtori. Algoritmi për të punuar me ta është i ngjashëm me operacionet në skedarë: së pari ju duhet të hapni drejtorinë, të kryeni disa veprime dhe, së fundi, ta mbyllni atë.

opendir

Ky funksion hap direktorinë e specifikuar dhe kthen identifikuesin e shërbimit për lidhjen e drejtorisë. Shtigjet e drejtorisë duhet të specifikohen si më poshtë:

Pika nënkupton hapjen e drejtorisë aktuale

. /files/

Hapja e një dosjeje dosjet ndodhet në drejtorinë aktuale

Hapja e një dosjeje një nivel më të lartë se ai aktual

leximi

Funksioni lexon direktorinë e hapur nga opendir. Për çdo kalim, ai kthen emrin e skedarit ose dosjes që ndodhet në drejtorinë e specifikuar dhe e zhvendos treguesin e brendshëm në objektin e drejtorisë tjetër. Pra, për të lexuar të gjithë drejtorinë duhet të përdoret në një lak.

Duhet të theksohet gjithashtu se ky funksion kthen objektet e shërbimit të dosjeve . Dhe .. , i cili mund të shkurtohet kur del nga deklarata IF.

i mbyllur

Ne mbyllim drejtorinë, duke specifikuar identifikuesin e lidhjes së dosjes si argument.

Ndonjëherë përdorimi i funksioneve të drejtorisë e bën jetën shumë më të lehtë. Për shembull, në seksionin Veçoritë, mund të shihni një listë të veçorive sipas rendit alfabetik. Mund ta imagjinoni se sa kohë do të duhet për të shkruar manualisht të gjithë këtë listë me lidhje, madje edhe sipas rendit alfabetik. Dhe këtu më ndihmuan funksionet për të punuar me drejtoritë. Çdo funksion u vendos në një skedar të veçantë me një emër që korrespondon me emrin e funksionit, pa asnjë shtesë.

Pra, sa herë që vizitoni faqen, ju merrni një listë funksionesh të krijuara rishtazi.

Kjo eshte e gjitha. Shihemi në mësimin tjetër.

Lista e drejtorive është procesi i marrjes së informacionit rreth drejtorive dhe skedarëve për një drejtori të caktuar prind, si dhe aftësia për të aplikuar filtra të ndryshëm në këto të dhëna për të korrigjuar daljen.

Në këtë shembull, ne do të përpiqemi të përballojmë një detyrë tipike që shfaqet pothuajse në çdo PHP projekt - marrja e një liste drejtorish dhe/ose skedarësh. Shembulli përdor disa qasje themelore dhe më komplekse, duke përshkruar të mirat dhe të këqijat e secilës teknikë. Tre zgjidhjet e para përdorin funksione standarde PHP. Zgjidhja më e fundit më e besueshme duke përdorur përsëritësit PHP SPL.


Për një paraqitje më vizuale, ne përdorim një strukturë drejtorie që duket si kjo:


\-Aplikacioni | \-Përdoruesi | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Zgjidhjet bazë
Grupi i parë i shembujve përdor funksione glob () dhe kombinime funksionesh opendir (), readdir(), mbyllur (), si dhe funksionin scandir ().

Duke përdorur glob()

Shembull i përdorimit të një funksioni php glob (), e cila ju lejon të kërkoni për një shteg duke përdorur një model.
Funksioni glob( $model,$flamuj) funksionon me dy argumente:
  • $model(kërkohet): vargu i modelit të kërkimit
  • $flamuj
    • GLOB_MARK- Shton një vijë të pjerrët në çdo drejtori të kthyer.
    • GLOB_NOSORT- Kthen skedarët në formën në të cilën gjenden në drejtori (pa renditje). Nëse ky flamur nuk është i specifikuar, atëherë emrat renditen sipas alfabetit.
    • GLOB_NOCHECK- Kthen një model kërkimi nëse nuk u gjet asnjë skedar duke e përdorur atë.
    • GLOB_NOESCAPE- Skemat e prapme nuk u shpëtojnë personazheve meta.
    • GLOB_BRACE- Zgjerohet (a,b,c) për të përshtatur "a", "b" ose "c".
    • GLOB_ONLYDIR- Kthen vetëm drejtoritë që përputhen me modelin.
    • GLOB_ERR- Ndalon në gabimet e leximit (për shembull, drejtoritë pa leje leximi), si parazgjedhje gabimet injorohen.
Për të kërkuar një drejtori për të gjithë skedarët dhe drejtoritë, emrat e të cilëve përfundojnë me .txt, përdorni kodin e mëposhtëm:Në dalje marrim rezultatin e mëposhtëm: array (2) ( => string (10) "readme.txt" => string (10) "serial.txt" ) Nëse keni nevojë të merrni një listë të skedarëve dhe drejtorive, emrat e të cilëve filloni me "te":Në dalje marrim rezultatin e mëposhtëm: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Marrja e vetëm direktorive me emra që përmbajnë "er" në listë:Në dalje marrim rezultatin e mëposhtëm: grupi (1) ( => vargu (4) "Përdoruesi" )

Shembulli i fundit përdor flamurin GLOB_ONLYDIR si argumenti i dytë i funksionit. Prandaj, vetëm direktoria "Përdorues" në emër, e cila përmban "er", u përfshi në listë. Funksioni glob() është shumë i lehtë për t'u përdorur, por ndonjëherë nuk është mjaft fleksibël. Nuk ka asnjë flamur për të marrë vetëm skedarë (pa drejtori) që përputhen me modelin.

Duke përdorur opendir(), readdir() dheclosedir().

Metoda tjetër për marrjen e një liste skedarësh dhe drejtorish është përdorimi i funksioneve PHP opendir (), readdir() Dhe mbyllur ().

Funksioni opendir () kthen një dorezë në drejtorinë e hapur. Pasi të merret doreza, mund të përdorni funksionin readdir(). Kur aksesoni një dorezë, funksioni readdir() shfaq emrin e skedarit ose drejtorisë tjetër. Nëse të gjithë elementët e përfshirë në përshkrues janë numëruar tashmë, funksioni readdir() do te kthehen i rremë. Për të mbyllur përshkruesin përdorim funksionin mbyllur ().


Ndryshe nga përdorimi i funksionit php , kjo qasje është pak më e ndërlikuar. Nuk është e mundur të vendosni paraprakisht parametrat e filtrimit që ndihmojnë për të gjeneruar një listë të emrave të skedarëve dhe drejtorive të kthyera. Për të marrë listën e kërkuar të skedarëve dhe drejtorive, filtrimi duhet të kryhet në mënyrë të pavarur.


Shembulli i mëposhtëm kthen një listë të emrave të skedarëve dhe drejtorive që fillojnë me "Ne":Dalja do të jetë si më poshtë: array(1) ( => string(4) "User" ) Shembulli i mëposhtëm do të nxjerrë vetëm skedarët që gjenden në direktorinë e dhënë.Në dalje marrim rezultatin e mëposhtëm: array(5) ( => string (10) "script.php" => string (7) "test.js" => string (9) "test.html" => string (10) "serial.txt" => varg (10) "readme.txt" )

Duke përdorur scandir().

Për të përfunduar, le të shohim një shembull të përdorimit të një funksioni php scandir (). Ai ka vetëm një atribut të kërkuar - shtegun për në direktorinë e leximit. Rezultati i funksionit është një grup skedarësh dhe drejtorish të vendosura përgjatë shtegut të specifikuar në argument. Ashtu si në shembullin e mëparshëm, për të marrë një listë të filtruar skedarësh dhe drejtorish, duhet ta ekzekutoni vetë. Vizualisht, zgjidhja është më e shkurtër dhe nuk kërkohet menaxhim i përshkruesit.


Shembulli tregon se si të merrni një listë të skedarëve dhe drejtorive, emrat e të cilëve fillojnë me "te":Në dalje marrim rezultatin e mëposhtëm: array(2) ( => string (9) "test.html" => string (7) "test.js" )

Zgjidhje e avancuar duke përdorur PHP SPL
Zgjidhje më e besueshme duke përdorur përsëritësit SPL FilesystemIterator, RecursiveDirectoryIterator Dhe GlobIterator.

Përdorimi i përsëritësve SPL.

Le të shohim përdorimin e përsëritësve SPL. Përpara se të fillojmë zgjidhjen e problemit, le të njihemi pak me bibliotekën PHP SPL dhe përsëritësit. Biblioteka SPL ofron grupe të specializuara klasash për strukturat e të dhënave të orientuara nga objekti, përsëritësit, përshkruesit e skedarëve dhe më shumë.


Avantazhi kryesor i iteratorëve është se ato janë klasa dhe mund të zgjerohen duke përdorur mekanizmin standard të trashëgimisë së klasës PHP. Një tjetër plus është se përsëritësit kanë metodat e tyre që mund të jenë të dobishme për zgjidhjen e problemeve të zakonshme, dhe ata janë të vendosur të gjithë në një vend. Le të shohim një shembull të përdorimit FilesystemIterator dhe krahasoni me readdir(). Të dyja metodat përdorin një lak, por në rast readdir() do të jetë e mundur të përpunohet vetëm vargu, por FilesystemIterator mund të punojë me një objekt. I cili mund të përmbajë informacion shtesë rreth skedarit ose drejtorisë si p.sh. pronari, madhësia, të drejtat e aksesit, etj.


Sigurisht, PHP ka aftësinë për të marrë këtë informacion duke përdorur funksionet, madhësia e skedarit (), pronari i skedarit () dhe të tjerët. Por PHP, si çdo gjuhë programimi, ka aftësinë të ndryshojë. Në PHP5 ka një dëshirë në rritje për të përdorur konceptet OOP. Prandaj, është më mirë të përdorni metoda moderne të punës me një gjuhë programimi.


Konsideroni përdorimin FilesystemIterator, RecursiveDirectoryIterator Dhe GlobIterator. Iteratori i parë trashëgohet nga DirectoryIterator, dhe pjesa tjetër nga FilesystemIterator. Ata të gjithë kanë të njëjtin konstruktor, i cili merr dy argumente:

  • $rrugë(i detyrueshëm): rruga për në artikullin e sistemit të skedarëve në të cilin kryhen operacionet
  • $flamuj(opsionale): një ose më shumë flamuj
    • Iteratori i sistemit të skedarëve::CURRENT_AS_PATHNAME Shkakton metodën FilesystemIterator::current() të kthejë një shteg.
    • Iteratori i sistemit të skedarëve::CURRENT_AS_FILEINFO Shkakton metodën FilesystemIterator::current() të kthejë një shembull të SplFileInfo.
    • Iteratori i sistemit të skedarëve::CURRENT_AS_SELF Shkakton që metoda FilesystemIterator::current() të kthejë $this (FilesystemIterator).
    • Iteratori i sistemit të skedarëve::CURRENT_MODE_MASK Masks FilesystemIterator::current()
    • Iteratori i sistemit të skedarëve::KEY_AS_PATHNAME Shkakton metodën FilesystemIterator::key() të kthejë një shteg.
    • Iteratori i sistemit të skedarëve::KEY_AS_FILENAME Shkakton metodën FilesystemIterator::key() për të kthyer emrin e skedarit.
    • Iteratori i sistemit të skedarëve::FOLLOW_SYMLINKS Detyron metodën RecursiveDirectoryIterator::hasChildren() të ndjekë lidhjet simbolike.
    • Iteratori i sistemit të skedarëve::KEY_MODE_MASK Masks FilesystemIterator::key()
    • Iteratori i sistemit të skedarëve::NEW_CURRENT_AND_KEY Njësoj si FilesystemIterator::KEY_AS_FILENAME | Iteratori i sistemit të skedarëve::CURRENT_AS_FILEINFO.
    • Iteratori i sistemit të skedarëve::SKIP_DOTS Kapërcen skedarët me pika (. dhe ..).
    • Iteratori i sistemit të skedarëve::UNIX_PATHS Detyron të gjitha shtigjet të përdorin prerje të pasme të stilit Unix, pavarësisht nga cilësimet e parazgjedhura të sistemit.

Dallimi në këta përsëritës është se si ato përdoren për të lundruar përgjatë një rruge të caktuar.

FilesystemIterator

Përdorni FilesystemIterator shume e thjeshte.
Shembulli tregon një kërkim për të gjithë skedarët dhe drejtoritë, emrat e të cilëve fillojnë me "te".

getFilename(),"te")===0): $arFileList = $obFile->getFilename(); endif; endforeach; //Nxjerr rezultatin var_dump($arFileList); ?> Në dalje marrim rezultatin e mëposhtëm: array (2) ( => string (7) "test.js" => string (9) "test.html" )

Shembull i përdorimit të një përsëritës tjetër RegexIterator për të kërkuar të gjithë skedarët dhe drejtoritë, emrat e të cilëve mbarojnë me "t.js" ose "t.php". Iterator RegexIterator përdoret për të filtruar rezultatin dhe përdor një motor shprehjeje të rregullt.

getfilename(); endforeach; //Nxjerr rezultatin var_dump($arFileList); ?> Në dalje marrim rezultatin e mëposhtëm: array (2) ( => string (10) "script.php" => string (7) "test.js" )

RecursiveDirectoryIterator

Iterator RecursiveDirectoryIterator ofron një ndërfaqe për kalimin rekurziv të drejtorive të sistemit të skedarëve. Ka disa metoda të dobishme si p.sh getChildren () Dhe ka Fëmijë (), të cilat kthejnë një përsëritës për vendndodhjen aktuale nëse është një drejtori, dhe kontrolloni nëse pika aktuale e hyrjes është një direktori.


RecursiveDirectoryIterator Dhe getChildren (). getChildren(), "/t\.(txt|css)$/"); $arFileList = grup(); foreach($rxIterator si $obFile): $arFileList = $obFile->getFilename(); endforeach; //Nxjerr rezultatin var_dump($arFileList); ?> Në dalje marrim rezultatin e mëposhtëm në këtë rast - ky është një skedar nga drejtoria "Përdoruesi": array(1) ( => string (8) "test.txt" )

GlobIterator

Iterator GlobIterator kryen një kalim skedari të ngjashëm me . Atributi i parë mund të përfshijë një model emri.


Shembulli tregon përdorimin GlobIterator me të njëjtin rezultat si më parë.getfilename(); endforeach; //Nxjerr rezultatin var_dump($arFileList); ?> Në dalje marrim rezultatin e mëposhtëm: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

konkluzioni

Shembujt e mësipërm shikuan metoda të ndryshme PHP për të arritur të njëjtin qëllim: marrjen e një liste skedarësh dhe drejtorish.

Pikat kryesore të mëposhtme mund të theksohen nga shembujt:

Artikujt më të mirë mbi këtë temë