Manipulimi i Direktorive me PHP
Duke përdorur fuqinë e PHP, do t’ju tregoj si të manipuloni direktoritë me shumë pak mund. Ju paralajmëroj se disa nga kodet e përfshira nuk janë shumë të thjeshta, por ju siguroj se me vëmendjen dhe dëshirën e duhur për të mësuar, gjithçka do marrë kuptim shpejt. Bashkojini këto njohuri me ato të manipulimit të skedarëve dhe do jeni një direktori-shfletues i papërmbajtshëm.
Në guidën e mëparshme ju tregova si të manipuloni skedarët duke përdorur fuqinë (dhe thjeshtësinë në të njëjtën kohë) e PHP. Me njohuritë e marra atje, tashmë dini si të lexoni skedarë, shkruani, fshini, etj. Në këtë guidë do ju mësoj si të manipuloni direktoritë për ti kompletuar njohuritë tuaja në punimin me Skedarët e Sistemit (aka FileSystem). Guida e mëparshme nuk është e detyrueshme, por ju këshilloj ti hidhni një sy.
Navigimi nëpër Direktori
Ashtu si jeni mësuar të navigoni direktoritë në nje sistem operativ, edhe në PHP mund të bëni të njëjtën gjë me 2 funksione: chdir() dhe getcwd(). Veprime të tjera si shfaqja e skedarëve kërkojnë më tepër pune, prandaj do i trajtoj më vonë në këtë guidë. Tani të fokusohemi një herë me këto 2 funksione të thjeshtë.
getcwd() – GET Current Working Directory – Përmes këtij funksioni mësojmë se në cilën direktori ndodhemi aktualisht, pra direktoria ku skedari aktual PHP egzekutohet.
| 1 | <?php |
| 2 | /* |
| 3 | do shfaqe direktorine aktuale. |
| 4 | psh: /feniksi/direktoria |
| 5 | */ |
| 6 | echo getcwd(); |
| 7 | ?> |
chdir() - Change Directory – Ndryshon virtualisht direktorinë e egzekutimit.
| 01 | ?php |
| 02 | /* |
| 03 | printojme direktorine aktuale. |
| 04 | psh: /feniksi |
| 05 | */ |
| 06 | echo getcwd(); |
| 07 | /* |
| 08 | ndryshojme direktorine aktuale |
| 09 | ne /feniksi/direktoria |
| 10 | */ |
| 11 | chdir('direktoria'); |
| 12 | echo getcwd(); |
| 13 | ?> |
Përmes këtyre dy funksioneve mund të navigoni lehtësisht sistemin e të shfaqni skedarët që ndodhen nën direktori, të përfshini skedarë, etj. Ky funksionalitet nuk është gjithmonë i domosdoshëm, por është aty nëse ju lind nevoja apo thjeshtë doni të eksperimentoni.
Krijimi i Direktorive
Ashtu si gjithçka tjetër deri tani, edhe krijimi i direktorive arrihet shumë lehtë; vetëm me një funksion i cili është mkdir().
| 1 | ?php |
| 2 | mkdir('drejt/nje/direktorie'); |
| 3 | ?> |
Kodi i mësipërm ka vetëm një problem. Po sikur direktoritë mëmë “drejt” dhe “nje” mos të egzistojnë, a do krijohet direktoria “direktorie“? Ashtu si e kam shkruar unë kodin jo, por fatmirësisht PHP 5 ofron një parametër rekursiv i cili i krijon automatikisht direktoritë mëmë jo egzistente. Parametri i dytë është niveli i akesit, ndërsa i treti përcakton nëse është rekursiv ose jo (TRUE ose FALSE).
| 1 | <?php |
| 2 | mkdir('drejt/nje/direktorie', 0700, TRUE); |
| 3 | ?> |
Leximi i Përmbajtjes së Direktorive
Ajo që na intereson nga një direktori nuk është fakti që egziston, por çfarë përmban brenda saj. Me PHP mund të shfletojmë shumë lehtë skedarët dhe nën-direktoritë që një direktori përmban. Shikoni shembullin më poshtë.
| 01 | <?php |
| 02 | /* |
| 03 | hapim direktorine fiktive 'direktori' e cila |
| 04 | krijohet si risurs per tu perdorur me pas |
| 05 | */ |
| 06 | $h = opendir('direktori'); |
| 07 | /* |
| 08 | shfletojme direktorine duke perdorur nje loop while(). |
| 09 | Ne momentin qe readdir() nuk gjen me skedare apo direktori, |
| 10 | ai kthen FALSE, duke e mbyllur loop-en while(). |
| 11 | */ |
| 12 | while(($skedar = readdir($h)) !== FALSE){ |
| 13 | //printojme emrin e skedarit |
| 14 | echo $skedar . '<br />'; |
| 15 | } |
| 16 | //mbyllim risursin e hapur |
| 17 | closedir($h); |
| 18 | ?> |
Shembulli më sipër është rasti më i thjeshtë për të lexuar një direktori, por mund të bëhet edhe më thjeshtë. PHP 5 ofron një funksion të ri për të paraqitur skedarët e një direktorie të quajtur scandir(). Teorikisht nuk kanë asnjë ndryshim, por në praktikë po. Me funksionin readdir() lexojmë dhe printojmë direkt emrin e skedarit e nëse do donim ta kalonim rezultatin në një vektor, do na duhej të bënim disa ndryshime të vogla. Ndërsa funksioni scandir() i kalon rezultatet direkt në një vektor, të cilin mund ta shfletojmë kur na nevojitet. Pra përdorni funksionin që i përshtatet skenarit tuaj.
| 1 | <?php |
| 2 | $skedaret = scandir('direktori'); |
| 3 | //shfletojmë vektorin dhe printojme rezultatet |
| 4 | foreach($skedaret as $skedari){ |
| 5 | echo $skedari . '<br />'; |
| 6 | } |
| 7 | ?> |
Shembujt e dhënë më sipër janë shumë mirë për aq kohë sa direktoria ka vetëm skedarë brenda. Problemi është se me to nuk marrim përmbajtjen e nën-direktorive që ndodhen brenda, për të krijuar një pemë të plotë të skedarëve. E lehtë për tu zgjidhur! Duke përdorur shembullin e parë (atë me readdir) do të ndërtojmë një funksion i cili shfleton skedarët dhe thërret veten e tij në mënyrë rekursive, për të shfaqur gjithçka që ndodhet brenda direktorive të niveleve më të thella. Gjithashtu kam shtuar edhe kod ekstra për disa kontrolle që i kam shpjeguar tek komentet. Kodi është paksa më kompleks se ato që kemi parë deri tani, sidomos nëse nuk jeni mësuar me rekursivitet, kështu që merrni kohën tuaj.
| 01 | <?php |
| 02 | function shfaqSkedaret($dir, $niveli){ |
| 03 | $h = opendir($dir); |
| 04 | |
| 05 | //kontrollojme nese opendir() kthen nje risurs |
| 06 | if($h){ |
| 07 | //shfletojme direktorine me nje loop while() |
| 08 | while(($skedar = readdir($h)) != FALSE){ |
| 09 | /* |
| 10 | . dhe .. jane aty per te naviguar ne direktorine meme ose |
| 11 | ne direktorine aktuale (ju kujtoj "cd ." dhe "cd ..", |
| 12 | por ne nuk na duhen dhe prandaj i heqim. |
| 13 | */ |
| 14 | if($skedar != '.' and $skedar != '..'){ |
| 15 | /* |
| 16 | gjenerojme hapesira ne baze te nivelit te direktorive, |
| 17 | i cili rritet me cdo thellesi. Thjeshte per nje paraqitje |
| 18 | me te kuptueshme te nen-direktorive. |
| 19 | */ |
| 20 | $hapesira = str_repeat(' ', ($niveli * 5)); |
| 21 | /* |
| 22 | me is_dir() kontrollojme nese vlera e marre i perket nje |
| 23 | direktorie. Nese po, i shtojme nje > perpara (qe ta dallojme |
| 24 | nga skedaret) dhe ri-therrasim funksionin i cili tashme |
| 25 | do shfletoje nen-direktorine e re. |
| 26 | */ |
| 27 | if(is_dir($dir . '/' . $skedar)){ |
| 28 | echo $hapesira . '> ' . $skedar . '<br />'; |
| 29 | shfaqSkedaret($dir . '/' . $skedar, $niveli + 1); |
| 30 | } else{ |
| 31 | /* |
| 32 | ketu arrijme nese vlera e marre eshte skedar (pra jo direktori) |
| 33 | dhe e printojme ate normalisht. |
| 34 | */ |
| 35 | echo $hapesira . $skedar . '<br />'; |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | //mbyllim risursin |
| 42 | closedir($h); |
| 43 | } |
| 44 | |
| 45 | /* |
| 46 | therrasim funksionin per here te pare me dy parametrat perkates. |
| 47 | Parametri i pare eshte direktoria qe duam te shfletojme. |
| 48 | Parametri i dyte eshte niveli fillestar sipas te cilit do te |
| 49 | llogariten hapesirat midis nen-direktorive. |
| 50 | */ |
| 51 | shfaqSkedaret('direktori', 0); |
| 52 | ?> |
Fshirja e Direktorive
Personalisht nuk e shoh me interes fshirjen e direktorive nga vetë fakti që në disa vite punë me PHP nuk më është dashur ndonjëherë për projekte reale. Megjithatë, secili ka nevojat dhe mënyrën e tij të kodimit, kështu që pse mos ta prekim edhe këtë pikë! Fshirja kryhet vetëm me një funksion, atë rmdir().
| 1 | <?php |
| 2 | rmdir('direktoria'); |
| 3 | ?> |
Kini parasysh që ky funksion fshin vetëm direktoritë boshe dhe do të prodhojë një Warning nëse direktoria mban skedarë. Edhe në këtë rast na duhet të shkruajmë nje funksion rekursiv i cili është shumë i ngjashëm me funksionin për leximin e direktorisë. Funksioni shfleton të gjithë skedarët brenda direktorisë dhe nën-direktorive të saj duke i fshirë e në fund fshin direktorinë që tashmë është bosh.
| 01 | <?php |
| 02 | function fshiDirektorine($dir){ |
| 03 | $h = opendir($dir); |
| 04 | |
| 05 | if($h){ |
| 06 | while(($skedar = readdir($h)) != FALSE){ |
| 07 | if($skedar != '.' and $skedar != '..'){ |
| 08 | $vendi = $dir . '/' . $skedar; |
| 09 | if(is_dir($vendi)){ |
| 10 | fshiDirektorine($vendi); |
| 11 | } else{ |
| 12 | //fshim skedaret |
| 13 | unlink($vendi); |
| 14 | } |
| 15 | } |
| 16 | } |
| 17 | } |
| 18 | |
| 19 | closedir($h); |
| 20 | //fshim direktorine qe tashme eshte bosh |
| 21 | rmdir($dir); |
| 22 | } |
| 23 | |
| 24 | fshiDirektorine('direktori'); |
| 25 | ?> |
Informacioni që ju kam dhënë deri tani varjon nga fillestarë absolutë në programues mesatar. Funksionet rekursivë që përmenda mund të mos jenë miku më i mirë për fillestarët, por kam besimin se me pak kujdes nuk do i keni problem. Thjeshtë kini parasysh që eksperimentimi është teknika më e mirë për të mësuar e fiksuar gjërat.
Po tani çfarë? Me njohuritë e marra në këtë leksion dhe në “Manipulimin e Skedarëve” jeni të gatshëm të merrni përsipër çdo sfidë që ka të bëjë me skedarët e sistemit. Doni një të bukur? Ndërtoni një Menaxhues Skedarësh (File Manager) me PHP që ofron këto funksionalitete:
- Shfaq skedarët e një direktorie me ikona të ndryshme për tipe të ndryshëm skedarësh (pdf, html, doc, etj)
- Mund të navigohet nëpër direktori duke shfaqur skedarët përkatës
- Direktoritë dhe skedarët mund të fshihen
- Mund të krijohen direktori të reja
- Skedarëve .txt mund tu shikohet përmbajtja dhe të editohen
Ju duket sfidë e vështirë? Ju siguroj që me ato që keni mësuar mund ta ndërtoni fare thjeshtë. Jepini një mundësi e nëse e krijoni, më tregoni rezultatin sepse jam shumë kurioz
Mësim të mbarë.
Fadion Dashi
Fadioni është prej shumë vitesh i apasionuar pas internetit dhe punon freelance si dizenjues dhe programues per web. Kur nuk është duke punuar, i pëlqen të shkruajë, të fotografojë, të admirojë koleskionin e tij të aparatëve fotografikë manualë dhe të kalojë kohë të bukur me miqtë.
per leximin e permbajtjes se direktorive ne php 5 edhe versionet e metjeshme eshte funksioni scandir() qe e thjeshteson shume leximin e direktorive
Nga mesi i guides kam treguar perdorimin e funksionit scandir() dhe krahasimin midis tij dhe readdir().
guidat qe keni vendosur deri tani jane ineteresante, sepse jane guida qe nuk kane egzistuar me pare ne shqip.
A nuk do te ishte me mire qe keto guida te perdoreshin se bashku per realizimin e nje produkti praktik>
P.sh. si te realizojme nje sistem te thjeshte menaxhimi me php/mysql(jo domosdoshmerisht nje cms), ne kete rast keto guidat behen jo vetem interesante por edhe nje pike referimi per dike qe deshiron te mesoje php/mysql per qellime praktike, pra te kaloje nga teoria ne realizimin e nje produkti. Mendoj qe nje praktike e tille do tju sillte edhe nje vazhdimesi lexuesish te interesuar per te ndjekur vazhdimin e projektit, Gjithsesi urime, jeni nder te paktet qe publikoni guida kaq te detajuara edhe te mirepunuara ne shqip.
Te falenderoj per komentin dhe fjalet e mira.
Ajo qe ti sygjeron eshte me se e drejte, sepse meson te ndertosh nje sistem te plote qe mund te perdoret ne praktike. Ne kete e kemi planifikuar qe ne hapat e pare te faqes, duke nxjerre edhe guiden e pare me kete ide, ate te ndertimit te nje CMS-je me PHP dhe MySQL. Por ka disa probleme ne realizimin e shpeshte te ketyre guidave:
1) Koha qe guida te tilla konsumojne eshte shume e madhe, sepse duhet te ndertosh sistemin nga zero, ta dokumentosh e ne fund te shkruash guiden permbledhese.
2) Interesi i komunitetit eshte i vogel, sepse shume pak merren seriozisht me programim per web. Nga sondazhet qe kemi bere, pjesa e madhe jane te interesuar ndaj bazave.
Megjithate ne duam te mbajme te kenaqur cdo nivel perdoruesisht, qofshin fillestar apo te avancuar dhe ti japim arsye per tu kthyer ne kete faqe. Ato qe kam menduar qe ne fillim (qe kur bera guiden per CMS-ne) jane guida te plota per realizimin e sistemeve si: Blog, Galeri Fotosh, Sistem Komentesh, etj dhe eshte e sigurte qe ne nje te ardhme i realizoj. Por, ka gjera shume me prioritare per tu bere nderkohe.
Faleminderit.