Professional Documents
Culture Documents
Directory Function Library
Directory Function Library
http://www.roosom.com
http://www.arabicosd.info
ﻗﺮیﺔ PHPاﻟﻌﺮﺑﻴﺔ
http://www.phpvillage.com
ﺑﻌﺾ اﻷﺷﻴﺎء ﻗﺒﻞ اﻟﺒﺪء
ﺗﺤﺘﻮي ﻣﻜﺘﺒﺔ Directory Function Libraryﻋﻠﻰ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺪوال وآﺎﺋﻦ واﺣﺪ ﺳﺄﺷﻴﺮ أﻟﻴﻪ ﺑﺎﻟﻠﻮن اﻷﺣﻤﺮ
opendir
closedir
readdir
rewinddir
chdir
getcwd
chroot
)dir (Object
scandir
وﺱﺄﻗﻮم ﺑﺈذن اﷲ ﺕﻌﺎﻟﻰ ﺑﺸﺮح آﻞ داﻟﺔ ﻋﻠﻰ ﺣﺪا راﺝﻴﻦ ﻡﻦ اﷲ اﻟﻌﻠﻲ اﻟﻘﺪیﺮ ان یﻮﻓﻘﻨﺎ ﻟﻤﺎ یﺤﺒﻪ ویﺮﺿﺎﻩ
وأن ﻧﻘﺪم اﻟﺨﻴﺮ اﻟﻴﻮم ﻋﺴﻰ ان ﻧﺠﺪﻩ ﻓﻲ أﺧﺮﺕﻨﺎ ﺑﺈذن اﷲ ﺕﻌﺎﻟﻰ .
وأرﺝﻮا ﻡﻤﻦ یﺠﺪ أي أﺧﻄﺎء ﺿﻤﻦ اﻟﻜﺘﻴﺐ ان یﺤﺎول إﺑﻼﻏﻲ ﻋﺒﺮ اﻟﺒﺮیﺪ اﻹﻟﻜﺘﺮوﻧﻲ او اﻟﻤﺎﺱﻨﺠﺮ وهﺬا ﺑﺮیﺪي
وهﻮ ﻧﻔﺴﻪ اﻟﻤﺎﺱﻨﺠﺮ ایﻀ ًﺎ ﻓﻜﻤﺎ یﻘﻮﻟﻮن )ﺝﻞ ﻡﻦ ﻻیﺴﻬﻮ(
eid200@gawab.com
أﻡﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺬیﻦ یﺮیﺪون اﻟﺤﺼﻮل ﻋﻠﻰ ﻧﻔﺲ هﺬا اﻟﻜﺘﻴﺐ وﻟﻜﻦ ﻟﺸﺮح ﻡﻜﺘﺒﺔ Winzipﻓﺴﺘﺠﺪوﻧﻪ ﻓﻲ ﻡﻜﺘﺒﺔ
اﻟﻤﻮﻗﻊ اﻟﻌﺮﺑﻲ ﻟﻠﻤﺼﺎدر اﻟﻤﻔﺘﻮﺣﺔ وهﺬا ﻋﻨﻮان اﻟﻤﻜﺘﺒﺔ
http://www.arabicosd.info/download
واﻵن اﺕﺮآﻚ ﻋﺰیﺰي اﻟﻘﺎرئ ﺕﻘﻠﺐ ﺱﻄﻮر هﺬا اﻟﻜﺘﻴﺐ اﻟﺬي أرﺝﻮا ان ﺕﺴﺘﻔﻴﺪ ﻡﻨﻪ ﺑﺈذن اﷲ ﺕﻌﺎﻟﻰ وﻟﻮ ﺑﺤﺮف
واﺣﺪ
opendir
ﺗﺴﺘﺨﺪم هﺬﻩ اﻟﺪاﻟﺔ ﻟﻔﺘﺢ ﻣﺠﻠﺪ ) (Directoryﻣﻌﻴﻦ واﻟﺘﻌﺎﻣﻞ ﻣﻌﻪ ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﻘﺒﺾ ) (Handleاﻟﺬي ﺗﻌﻴﺪﻩ هﺬﻩ اﻟﺪاﻟﺔ ﻓﻲ ﺣﺎﻟﺔ ﻧﺠﺎح
ﻋﻤﻠﻴﺔ اﻟﻔﺘﺢ وذﻟﻚ ﺑﺄﺧﺬ ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﻤﺮاد ﻓﺘﺤﻪ .
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﺗﺄﺧﺬ ﺑﺎراﻣﺘﺮ واﺣﺪ آﺎﻟﺘﺎﻟﻲ :
path
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (pathﻳﺴﺘﺨﺪم ﻟﺘﺤﺪﻳﺪ ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﻤﺮاد ﻓﺘﺤﻪ ﺑﺎﻟﺪاﻟﺔ opendirﻓﻜﻤﺎ ﺗﻼﺣﻆ ان ) (pathهﻮ ﻣﻦ ﻧﻮع ) (stringأي ﺳﻠﺴﻠﺔ
ﺣﺮﻓﻴﺔ وﺑﻜﻞ ﺑﺴﺎﻃﺔ ﺣﺪد اﻟﻤﺴﺎر آﺴﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ ﻣﺜﻞ . ("/home/tempdir/") :
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ اﻟﻨﻮع ) (resourceوهﻲ ﺗﻤﺜﻞ ﻣﻘﺒﺾ ) (Handleاﻹﺗﺼﺎل ﻣﻊ اﻟﻤﺠﻠﺪ
اﻟﻤﻔﺘﻮح وﻟﻜﻦ هﺬﻩ اﻟﻘﻴﻤﺔ ﻓﻲ ﺣﺎﻟﺔ ﻧﺠﺎح ﻋﻤﻠﻴﺔ اﻹﺗﺼﺎل اﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻓﺸﻞ اﻹﺗﺼﺎل ﺑﺎﻟﻤﺠﻠﺪ وﻓﺘﺤﻪ ﻓﺈن اﻟﺪاﻟﺔ ﺗﻌﻴﺪ . FALSE
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
;)"$dhand = @opendir("images/
)if(!$dhand
ً ﻟﻘﺪ ﺗﻌﺬر ﻓﺘﺢ اﺠﻤﻟﻠﺪ"(die
;)"ﻋﺬرا
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻠﻘﺪ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻟﻔﺘﺢ ﻣﺠﻠﺪ ﺧﺎص ﺑﺎﻟﺼﻮر اﺳﻤﻪ imagesوإﻋﺎدة
اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﻣﺘﻐﻴﺮ ﺑﺈﺳﻢ dhandواﻟﺬي ﺳﻴﻤﺜﻞ ﻣﻘﺒﺾ اﻹﺗﺼﺎل ﺑﺎﻟﻤﺠﻠﺪ .
وﺑﻌﺪ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻳﺠﺐ ﻋﻠﻴﻨﺎ اﺧﺘﺒﺎر اﻟﻨﺘﻴﺠﺔ اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﻤﺘﻐﻴﺮ dhandﻟﻤﻌﺮﻓﺔ ﺣﺎﻟﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ )هﻞ هﻲ ﻧﺎﺟﺤﺔ ام ﻓﺸﻠﺖ
ﻋﻤﻠﻴﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ( ﺣﻴﺚ ﻗﻤﻨﺎ ﺑﻮﺿﻊ ﺟﻤﻠﺔ ifواﻟﺘﺄآﺪ ﻣﻦ ﻧﺠﺎح اﻟﺪاﻟﺔ او ﻓﺸﻠﻬﺎ وﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ اﺳﺘﺨﺪﻣﻨﺎ اﻟﺪاﻟﺔ dieﻟﻄﺒﺎﻋﺔ رﺳﺎﻟﺔ
ﻟﻠﻤﺴﺘﺨﺪم وإﻧﻬﺎء اﻟﺴﻜﺮﺑﺖ اﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻨﺠﺎح ﻓﺈﻧﻪ ﻳﻤﻜﻨﻚ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﺘﻐﻴﺮ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻘﺒﺾ
اﻹﺗﺼﺎل وهﻮ اﻟﻤﺘﻐﻴﺮ . dhand
closedir
وأﻇﻦ ان هﺬﻩ اﻟﺪاﻟﺔ ﻻ ﺗﺤﺘﺎج إﻟﻰ ﺷﺮح ﻣﻄﻮل وأﻇﻦ أﻧﻚ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻗﺪ ﻓﻬﻤﺘﻬﺎ ﻓﺎﻟﻤﻬﻢ أن هﺬﻩ اﻟﺪاﻟﺔ ﺗﺴﺘﺨﺪم ﻹﻏﻼق اﻟﻤﺠﻠﺪ
اﻟﺬي ﻗﻤﻨﺎ ﺑﻔﺘﺤﻪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ . opendir
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﺗﺄﺧﺬ ﺑﺎراﻣﺘﺮ واﺣﺪ آﺎﻟﺘﺎﻟﻲ :
dirhandle
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (dirhandleﻳﺴﺘﺨﺪم ﻟﺘﺤﺪﻳﺪ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ ﻓﺘﺤﻪ ﺑﺎﻟﺪاﻟﺔ opendirﻓﻜﻤﺎ ﺗﻼﺣﻆ ان ) (dirhandleهﻮ ﻣﻦ ﻧﻮع
) (resourceوهﻲ ﻧﻔﺲ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﺗﻌﻴﺪهﺎ اﻟﺪاﻟﺔ opendirواﻟﺘﻲ ﻳﺘﻢ اﻹﺣﺘﻔﺎظ ﺑﻬﺎ ﻓﻲ ﻣﺘﻐﻴﺮ و إذا اﻧﺘﻬﺖ اﻟﻌﻤﻠﻴﺎت ﻋﻠﻰ اﻟﻤﺠﻠﺪ ﻳﺘﻢ ﺗﻤﺮﻳﺮ
اﻟﻤﺘﻐﻴﺮ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح إﻟﻰ اﻟﺪاﻟﺔ closedirﻹﻏﻼق اﻟﻤﺠﻠﺪ .
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻻﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻓﺎﻟﻨﻮع اﻟﻤﻜﺘﻮب هﻮ ) (voidوﺗﺘﺮﺟﻢ ﻓﻲ ﺑﻌﺾ اﻟﻜﺘﺐ ﻋﻠﻰ اﻧﻬﺎ ﻧﻮع
ﻋﻘﻴﻢ أي ﻻ ﻳﻔﻌﻞ ﺷﻴﺌﺎً وﻳﺸﻴﺮون ﻟﻬﺎ ﻓﻲ اﻟﻜﺘﺐ اﻹﻧﺠﻠﻴﺰﻳﺔ ﺑﻜﻠﻤﺔ ) (nothingأي ﻻ ﺷﺊ .
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
;)"$dhand = @opendir("images/
)if(!$dhand
ً ﻟﻘﺪ ﺗﻌﺬر ﻓﺘﺢ اﺠﻤﻟﻠﺪ"(die
;)"ﻋﺬرا
;)closedir($dbhand
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻠﻘﺪ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻟﻔﺘﺢ ﻣﺠﻠﺪ ﺧﺎص ﺑﺎﻟﺼﻮر اﺳﻤﻪ imagesوإﻋﺎدة
اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﻣﺘﻐﻴﺮ ﺑﺈﺳﻢ dhandواﻟﺬي ﺳﻴﻤﺜﻞ ﻣﻘﺒﺾ اﻹﺗﺼﺎل ﺑﺎﻟﻤﺠﻠﺪ .
وﺑﻌﺪ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻳﺠﺐ ﻋﻠﻴﻨﺎ اﺧﺘﺒﺎر اﻟﻨﺘﻴﺠﺔ اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﻤﺘﻐﻴﺮ dhandﻟﻤﻌﺮﻓﺔ ﺣﺎﻟﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ )هﻞ هﻲ ﻧﺎﺟﺤﺔ ام ﻓﺸﻠﺖ
ﻋﻤﻠﻴﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ( ﺣﻴﺚ ﻗﻤﻨﺎ ﺑﻮﺿﻊ ﺟﻤﻠﺔ ifواﻟﺘﺄآﺪ ﻣﻦ ﻧﺠﺎح اﻟﺪاﻟﺔ او ﻓﺸﻠﻬﺎ وﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ اﺳﺘﺨﺪﻣﻨﺎ اﻟﺪاﻟﺔ dieﻟﻄﺒﺎﻋﺔ رﺳﺎﻟﺔ
ﻟﻠﻤﺴﺘﺨﺪم وإﻧﻬﺎء اﻟﺴﻜﺮﺑﺖ اﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻨﺠﺎح ﻓﺈﻧﻪ ﻳﻤﻜﻨﻚ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﺘﻐﻴﺮ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻘﺒﺾ
اﻹﺗﺼﺎل وهﻮ اﻟﻤﺘﻐﻴﺮ . dhand
وﺑﻌﺪ اﺟﺮاء ﺑﻌﺾ اﻟﻌﻤﻠﻴﺎت ﻋﻠﻰ اﻟﻤﺠﻠﺪ واﻹﻧﺘﻬﺎء ﻣﻨﻪ ﺗﻢ إﻏﻼق اﻟﻤﺠﻠﺪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ closedirوذﻟﻚ ﺑﺘﻤﺮﻳﺮ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح إﻟﻴﻬﺎ
ﻹﻏﻼﻗﻪ .
getcwd
ﺗﺴﺘﺨﺪم هﺬﻩ اﻟﺪاﻟﺔ ﺑﺸﻜﻞ ﻓﺮدي أي دون اﺳﺘﺨﺪام أي داﻟﺔ ﻣﻌﻬﺎ ﻣﺜﻞ opendirاو closedirﻓﻤﻬﻤﺔ هﺬﻩ اﻟﺪاﻟﺔ هﻲ اﺣﻀﺎر ﻣﺴﺎر اﻟﻤﺠﻠﺪ
اﻟﺤﺎﻟﻲ او اﻟﺬي اﻗﻮم ﺑﺎﻟﻌﻤﻞ ﺿﻤﻨﻪ وهﺬﻩ اﻟﺪاﻟﺔ ﻣﻔﻴﺪة ﻓﻲ ﺣﺎل آﻨﺖ اﻋﻤﻞ ﻓﻲ ﻣﺠﻠﺪ ﻣﻌﻴﻦ وأﻧﺎ ﻻ أﻋﺮف ﻣﺴﺎرﻩ ﻓﻬﺬﻩ اﻟﺪاﻟﺔ ﺳﺘﺘﻜﻔﻞ ﺑﺠﻠﺐ
ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ ﺣﺎﻟﻴﺎً )أو آﻤﺎ ﻳﻘﻮﻟﻮن ﻣﺠﻠﺪ اﻟﻌﻤﻞ اﻟﻨﺸﻂ( .
أﻣﺎ cwdﻓﻬﻲ اﺧﺘﺼﺎر ﻟـ ) (Current Working Directoryأي ﻣﺠﻠﺪ اﻟﻌﻤﻞ اﻟﺤﺎﻟﻲ او اﻟﻤﺠﻠﺪ اﻟﻨﺸﻂ واﻟﻤﻘﺼﻮد ﺑﺎﻟﻨﺸﻂ أي اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ
ﺣﺎﻟﻴﺎً
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﻻ ﺗﺄﺧﺬ أي ﺑﺎراﻣﺘﺮ ﻓﺎﻟﻜﻠﻤﺔ ) (voidآﻤﺎ أﺷﺮﻧﺎ ﻟﻬﺎ ﻓﻲ اﻟﺴﺎﺑﻖ ﻻﺗﻌﻤﻞ أي ﺷﺊ
وهﺬا ﻻ ﻳﻌﺘﺒﺮ ﺑﺎراﻣﺘﺮ ﻟﻠﺪاﻟﺔ
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ اﻟﻨﻮع ) (stringوهﻲ ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ ﺗﻤﺜﻞ ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﺤﺎﻟﻲ
اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
ﻋﻠﻰ اﻓﺘﺮاض ان اﻟﻤﺠﻠﺪ اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ هﻮ )" ("home/images/وأﻧﺎ ﻻ أﻋﻠﻢ ﺑﻤﺴﺎر اﻟﻤﺠﻠﺪ اﻟﺤﺎﻟﻲ اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ .
;)($cdir = getcwd
echo ($cdir); // output is : home/images/
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻜﻤﺎ اﻓﺘﺮﺿﻨﺎ ان ﻣﺴﺎر اﻟﻌﻤﻞ اﻟﺤﺎﻟﻲ هﻮ )" ("home/images/وأﻧﺎ ﻻ أﻋﺮف اﻟﻤﺴﺎر
اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ ﻓﺈن اﻟﺪاﻟﺔ ﺗﻌﻴﺪ هﺬا اﻟﻤﺴﺎر وﺗﺤﺘﻔﻆ ﺑﻪ ﻓﻲ اﻟﻤﺘﻐﻴﺮ . cdir
وﻓﻲ اﻷﺧﻴﺮ ﻗﻤﻨﺎ ﺑﻄﺒﺎﻋﺔ اﻟﻤﺴﺎر اﻟﺤﺎﻟﻲ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ echoوﺗﻤﺮﻳﺮ اﻟﻤﺴﺎر اﻟﺤﺎﻟﻲ اﻟﺬي ﺗﻢ ﺣﻔﻈﻪ ﻓﻲ اﻟﻤﺘﻐﻴﺮ cdirوأرﺟﻮا ﻣﻦ اﷲ اﻟﻌﻠﻲ
اﻟﻘﺪﻳﺮ أن ﺗﻜﻮن اﻟﻔﻜﺮة ﻗﺪ وﺻﻠﺖ إﻟﻰ ذهﻨﻚ ﻋﺰﻳﺰ اﻟﻘﺎرئ ﺣﻮل وﻇﻴﻔﺔ هﺬﻩ اﻟﺪاﻟﺔ .
chdir
ﺗﺴﺘﺨﺪم هﺬﻩ اﻟﺪاﻟﺔ ﺑﺸﻜﻞ ﻓﺮدي أي دون اﺳﺘﺨﺪام أي داﻟﺔ ﻣﻌﻬﺎ ﻣﺜﻞ opendirاو closedirاﻳﻀﺎً ﻓﻤﻬﻤﺔ هﺬﻩ اﻟﺪاﻟﺔ هﻲ ﺗﻐﻴﻴﺮ ﻣﺴﺎر
اﻟﻤﺠﻠﺪ اﻟﺤﺎﻟﻲ او اﻟﻨﺸﻂ واﻟﺬي ﻳﻤﻜﻨﻨﺎ ﻣﻌﺮﻓﺘﻪ ﺑﺎﻟﺪاﻟﺔ getcwdاﻟﺴﺎﺑﻖ ﺷﺮﺣﻬﺎ .
ﻣﻼﺣﻈﺔ
اﻟﺨﻼﺻﺔ اﻷﺳﺎﺳﻴﺔ ﻣﻦ وراء اﻟﺪاﻟﺔ chdirهﻲ ﻟﺘﻐﻴﻴﺮ ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﺤﺎﻟﻲ او اﻟﻨﺸﻂ اﻟﺬي ﻳﻤﻜﻨﻨﺎ ﻣﻌﺮﻓﺘﻪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ getcwdاﻟﺴﺎﺑﻖ
ﺷﺮﺣﻬﺎ اﻣﺎ اﺳﻢ اﻟﺪاﻟﺔ ﻓﻬﻮ اﺧﺘﺼﺎر ﻟﻠﻌﺒﺎرة ) (Change Directoryوهﻲ ﺗﺆﺛﺮ ﻋﻠﻰ ﻗﻴﻤﺔ اﻟﺪاﻟﺔ getcwdﺣﻴﺚ ﺗﻐﻴﺮ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﺗﺸﻴﺮ إﻟﻴﻬﺎ داﻟﺔ
getcwdوﺗﺘﺤﻜﻢ ﻓﻴﻬﺎ.
داﻟﺔ chroot
ﺗﺘﻀﻤﻦ اﻟﻤﻜﺘﺒﺔ Directory Function Libraryداﻟﺔ ﺑﺈﺳﻢ chrootوهﻲ ﺗﺸﺒﻪ ﻟﺤﺪ آﺒﻴﺮ اﻟﺪاﻟﺔ chdirﻟﺬﻟﻚ ﻟﻦ اﺗﻄﺮق ﻟﺸﺮﺣﻬﺎ
.
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﻓﺈﻧﻬﺎ ﺗﺄﺧﺬ ﺑﺎرﻣﺘﺮ واﺣﺪ آﺎﻟﺘﺎﻟﻲ :
directory
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (directoryوهﻮ ﻣﻦ ﻧﻮع ) (stringأي ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ وﻳﺘﻢ ﻓﻴﻪ ﺗﺤﺪﻳﺪ ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﻤﺮاد ﺟﻌﻠﻪ اﻟﻤﺠﻠﺪ اﻟﻨﺸﻂ وﻟﻤﻌﺮﻓﺔ اﻟﻤﺠﻠﺪ
اﻟﻨﺸﻂ اﻟﺮﺟﺎء راﺟﻊ ﺷﺮح اﻟﺪاﻟﺔ getcwdﻟﻤﻌﺮﻓﺔ اﻟﻤﺠﻠﺪ اﻟﻨﺸﻂ.
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ اﻟﻨﻮع ) (boolوهﻲ ﻗﻴﻤﺔ ﺑﻮﻟﻴﺎﻧﻴﺔ وﻟﺬﻟﻚ ﺳﺘﻜﻮن اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﺣﺎﻟﺔ
ﻧﺠﺎح ﺗﻐﻴﻴﺮ اﻟﻤﺠﻠﺪ اﻟﻨﺸﻂ هﻲ TRUEأﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ ﻓﻬﻲ . FALSE
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
ﻋﻠﻰ اﻓﺘﺮاض ان اﻟﻤﺠﻠﺪ اﻟﺬي اﻋﻤﻞ ﻓﻴﻪ هﻮ )" ("home/images/ﻟﺬﻟﻚ ﺳﺘﻜﻮن ﻗﻴﻤﺔ اﻟﺪاﻟﺔ getcwdهﻲ ﻧﻔﺲ اﻟﻤﺴﺎر وﻋﻠﻰ اﻓﺘﺮاض ان ﻣﺠﻠﺪ
imagesاﻟﺬي اﻋﻤﻞ ﻓﻴﻪ ﻳﺤﺘﻮي ﺑﺪاﺧﻠﻪ ﻋﻠﻰ ﻣﺠﻠﺪ ﺑﺈﺳﻢ abdullaheidوأﻧﺎ اود ﺗﻐﻴﻴﺮ اﻟﻤﺴﺎر إﻟﻰ داﺧﻞ هﺬا اﻟﻤﺠﻠﺪ .
ﻓﺒﻤﺎ أﻧﻨﻲ داﺧﻞ ﻣﺠﻠﺪ imagesﺣﺎﻟﻴﺎً ﻓﺴﺄآﺘﻔﻲ ﺑﺘﺤﺪﻳﺪ اﺳﻢ اﻟﻤﺠﻠﺪ abdullaheidﻟﻠﺪاﻟﺔ chdirوإﻟﻴﻚ اﻟﻤﺜﺎل
;)($cdir = getcwd
echo ($cdir); // output is : home/images/
;)'chdir ('abdullaheid
;)($cdir = getcwd
echo ($cdir); // output is : home/images/abdullaheid/
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻜﻤﺎ اﻓﺘﺮﺿﻨﺎ ان ﻣﺴﺎر اﻟﻌﻤﻞ اﻟﺤﺎﻟﻲ هﻮ )" ("home/images/ﻓﺈن اﻟﺪاﻟﺔ getcwd
ﺗﻌﻴﺪ هﺬا اﻟﻤﺴﺎر وﺗﺤﺘﻔﻆ ﺑﻪ ﻓﻲ اﻟﻤﺘﻐﻴﺮ . cdir
وﺑﻌﺪ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ chdirﻟﺘﺘﻐﻴﺮ اﻟﻤﺴﺎر واﻟﺪﺧﻮل إﻟﻰ ﻣﺠﻠﺪ abdullaheidﻓﺈن اﻟﺪاﻟﺔ getcwdﻗﺪ ﺗﺄﺛﺮت وأﺻﺒﺢ ﻣﺨﺮﺟﺎﺗﻬﺎ هﻲ اﻟﻤﺴﺎر اﻟﺬي
ﻗﻤﻨﺎ ﺑﺎﻟﺪﺧﻮل إﻟﻴﻬﺎ ﺑﻮاﺳﻄﺔ اﻟﺪاﻟﺔ chdirوأرﺟﻮا ﻣﻦ اﷲ اﻟﻌﻠﻲ اﻟﻘﺪﻳﺮ أن ﺗﻜﻮن اﻟﻮﻇﻴﻔﺔ اﻟﺨﺎﺻﺔ ﺑﻬﺬﻩ اﻟﺪاﻟﺔ ﻗﺪ ﺗﻢ ﻓﻬﻤﻬﺎ ﻋﻠﻰ اﻟﻮﺟﺪ اﻷآﻤﻞ
ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ .
readdir
ﺗﻘﻮم هﺬﻩ اﻟﺪاﻟﺔ ﺑﻘﺮاءة اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ ﻓﺘﺤﻪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirوﺗﻌﻴﺪ ﻟﻨﺎ اﺳﻢ أول ﻣﻠﻒ أو ﻣﺠﻠﺪ ﻣﻮﺟﻮد داﺧﻞ اﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﻨﺎ
ﺑﻔﺘﺤﺔ ﺑﺎﻟﺪاﻟﺔ opendirو اذا اﺳﺘﺨﺪﻣﺖ اﻟﺪاﻟﺔ readirﻣﺒﺎﺷﺮة وﺑﺪون أي ﺷﺊ ﻓﺈﻧﻬﺎ ﺳﺘﺮﺟﻊ ﻓﻘﻂ اﻟﻤﻠﻒ او اﻟﻤﺠﻠﺪ اﻷول داﺧﻞ اﻟﻤﺠﻠﺪ اﻟﺬي
ﺗﻢ ﻓﺘﺤﻪ واﻟﺴﺒﺐ ﻓﻲ ذﻟﻚ اﻧﻚ ﻋﻨﺪﻣﺎ ﺗﻔﺘﺢ أي ﻣﺠﻠﺪ ﺑﺎﻟﺪاﻟﺔ opendirﻓﺈن هﻨﺎك ﺷﺊ ﻳﺴﻤﻰ ) (Virtual Pointerأو اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ وهﻮ
ﻳﺸﻴﺮ إﻟﻰ أول ﻣﻠﻒ أو ﻣﺠﻠﺪ ﻓﻲ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وﻟﻠﻮﺻﻮل ﻟﺠﻤﻴﻊ اﻟﻤﻠﻔﺎت واﻟﻤﺠﻠﺪات اﻟﻤﻮﺟﻮدة ﺿﻤﻦ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح ﻓﺈﻧﻨﺎ ﻧﺴﺘﺨﺪم ﺣﻠﻘﺔ
ﻣﺜﻞ whileﻟﻜﻲ ﻧﻘﻮم ﺑﺘﺤﺮﻳﻚ اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ إﻟﻰ اﻟﻤﻠﻒ او اﻟﻤﺠﻠﺪ اﻟﺜﺎﻧﻲ ﺛﻢ اﻟﺜﺎﻟﺚ وهﻜﺬا ﺣﺘﻰ ﻧﺼﻞ إﻟﻰ اﻟﻨﻬﺎﻳﺔ .
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﺗﺄﺧﺬ ﺑﺎراﻣﺘﺮ واﺣﺪ آﺎﻟﺘﺎﻟﻲ :
dirhandle
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (dirhandleﻳﺴﺘﺨﺪم ﻟﺘﺤﺪﻳﺪ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ ﻓﺘﺤﻪ ﺑﺎﻟﺪاﻟﺔ opendirﻓﻜﻤﺎ ﺗﻼﺣﻆ ان ) (dirhandleهﻮ ﻣﻦ ﻧﻮع
) (resourceوهﻲ ﻧﻔﺲ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﺗﻌﻴﺪهﺎ اﻟﺪاﻟﺔ opendirواﻟﺘﻲ ﻳﺘﻢ اﻹﺣﺘﻔﺎظ ﺑﻬﺎ ﻓﻲ ﻣﺘﻐﻴﺮ وﻟﻠﻘﺮاءة ﻳﺠﺐ ان ﻧﺤﺪد ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ
ﻓﺘﺤﻪ ﺑﺎﻟﺪاﻟﺔ opendirوﻧﻤﺮرﻩ ﻟﻠﺪاﻟﺔ readdirﻟﻜﻲ ﺗﻌﺮف اﻟﺪاﻟﺔ اﻟﻤﺠﻠﺪ اﻟﺬي ﻳﺠﺐ اﻟﻘﺮاءة ﻣﻨﻪ
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ اﻟﻨﻮع ) (stringوهﻲ ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ ﺗﻤﺜﻞ اﺳﻢ اﻟﻤﺠﻠﺪ او اﻟﻤﻠﻒ
اﻟﺬي ﺗﻤﺖ ﻗﺮاءﺗﻪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ .
ﺗﻌﻴﺪ اﻟﺪاﻟﺔ اﻟﻘﻴﻤﺔ FALSEﻓﻲ ﺣﺎل ﻓﺸﻠﻬﺎ او اﻧﺘﻬﺎﺋﻬﺎ ﻣﻦ ﻗﺮاءة آﺎﻣﻞ اﻟﻤﺠﻠﺪ واﻟﻮﺻﻮل إﻟﻰ ﻧﻬﺎﻳﺘﻪ
ﻣﻼﺣﻈﺔ
هﺬﻩ اﻟﺪاﻟﺔ ﻻﺗﻘﺮأ اﻟﻤﻠﻔﺎت اﻟﺘﻲ ﺑﺪاﺧﻞ اﻟﻤﺠﻠﺪ أي هﻲ ﻻﺗﻘﻮم ﺑﻔﺘﺤﻬﺎ وﻗﺮاءﺗﻬﺎ وﻣﻌﺮﻓﺔ ﻣﺤﺘﻮﻳﺎت اﻟﻤﻠﻒ او اﻟﻤﺠﻠﺪ واﻧﻤﺎ ﻓﻘﻂ ﺗﻘﺮاء اﺳﻤﺎء اﻟﻤﻠﻔﺎت
واﻟﻤﺠﻠﺪات اﻟﻤﻮﺟﻮدة داﺧﻞ اﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﻨﺎ ﺑﻔﺘﺤﻪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ . opendir
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
ﻋﻠﻰ اﻓﺘﺮاض ان اﻟﻤﺠﻠﺪ اﻟﺬي ﺳﺄﻓﺘﺤﻪ هﻮ )" ("home/images/وﻳﺤﺘﻮي هﺬا اﻟﻤﺠﻠﺪ ﻋﻠﻰ اﻟﻤﻠﻔﺎت اﻟﺘﺎﻟﻴﺔ :
Abdullah.gif -١
eid.swf -٢
;)"$dhand = @opendir("home/images/
)if(!$dhand
ً ﻟﻘﺪ ﺗﻌﺬر ﻓﺘﺢ اﺠﻤﻟﻠﺪ"(die
;)"ﻋﺬرا
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻠﻘﺪ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻟﻔﺘﺢ ﻣﺠﻠﺪ ﺧﺎص ﺑﺎﻟﺼﻮر اﺳﻤﻪ home/images/
وإﻋﺎدة اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﻣﺘﻐﻴﺮ ﺑﺈﺳﻢ dhandواﻟﺬي ﺳﻴﻤﺜﻞ ﻣﻘﺒﺾ اﻹﺗﺼﺎل ﺑﺎﻟﻤﺠﻠﺪ .
وﺑﻌﺪ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻳﺠﺐ ﻋﻠﻴﻨﺎ اﺧﺘﺒﺎر اﻟﻨﺘﻴﺠﺔ اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﻤﺘﻐﻴﺮ dhandﻟﻤﻌﺮﻓﺔ ﺣﺎﻟﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ )هﻞ هﻲ ﻧﺎﺟﺤﺔ ام ﻓﺸﻠﺖ
ﻋﻤﻠﻴﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ( ﺣﻴﺚ ﻗﻤﻨﺎ ﺑﻮﺿﻊ ﺟﻤﻠﺔ ifواﻟﺘﺄآﺪ ﻣﻦ ﻧﺠﺎح اﻟﺪاﻟﺔ او ﻓﺸﻠﻬﺎ وﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ اﺳﺘﺨﺪﻣﻨﺎ اﻟﺪاﻟﺔ dieﻟﻄﺒﺎﻋﺔ رﺳﺎﻟﺔ
ﻟﻠﻤﺴﺘﺨﺪم وإﻧﻬﺎء اﻟﺴﻜﺮﺑﺖ اﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻨﺠﺎح ﻓﺈﻧﻪ ﻳﻤﻜﻨﻚ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﺘﻐﻴﺮ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻘﺒﺾ
اﻹﺗﺼﺎل وهﻮ اﻟﻤﺘﻐﻴﺮ . dhand
واﻵن إذا ﻧﺠﺢ ﻓﺘﺢ اﻟﻤﺠﻠﺪ ﻓﺈﻧﻪ ﺳﺘﺘﻢ اﻹﺷﺎرة إﻟﻰ أو ﻣﻠﻒ ﻓﻲ اﻟﻤﺠﻠﺪ ﺑﻮاﺳﻄﺔ اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ وﺳﻴﻜﻮن أول ﻣﻠﻒ هﻮ Abdullah.gifﻓﺴﺘﻘﺮأ
اﻟﺪاﻟﺔ readdirاﺳﻢ اﻟﻤﻠﻒ اﻷول وﺗﺨﺰﻧﻪ ﻓﻲ اﻟﻤﺘﻐﻴﺮ fileوﺑﻌﺪ ذﻟﻚ ﻳﺘﻢ اﻟﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ fileﻓﻲ ﻧﻔﺲ رأس اﻟﺤﻠﻘﺔ whileﺛﻢ ﻳﻄﺒﻊ
اﻟﻤﻠﻒ اﻷول وهﻮ Abdullah.gifﺛﻢ ﻳﻜﺮر اﻟﺤﻠﻘﺔ ﻓﻴﺠﺪ اﻟﻤﻠﻒ eid.swfوﻳﻄﺒﻌﻪ ﺛﻢ ﻳﻌﻴﺪ اﻟﺤﻠﻘﺔ وﻻﻳﺠﺪ ﺷﺊ ﻓﻴﻌﻴﺪ falseوﻳﻨﻬﻲ اﻟﺤﻠﻘﺔ . while
وﺑﻌﺪ ا ﺟﺮاء اﻟﻌﻤﻠﻴﺎت ﻋﻠﻰ اﻟﻤﺠﻠﺪ و اﻹﻧﺘﻬﺎء ﻣﻨﻪ ﺗﻢ إﻏﻼق اﻟﻤﺠﻠﺪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ closedirوذﻟﻚ
ﺑﺘﻤﺮﻳﺮ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح إﻟﻴﻬﺎ ﻹﻏﻼﻗﻪ .
ﻣﻼﺣﻈﺔ هﺎﻣﺔ
ﻋﻨﺪ ﻣﺎ ﻳﺘﻢ اﻟﻘﺮاءة ﺑﻮاﺳﻄﺔ اﻟﺪاﻟﺔ readdirإﻟﻰ ﻧﻬﺎﻳﺔ اﻟﻤﺠﻠﺪ وﻣﻦ ﺛﻢ ﻟﻢ ﻳﺘﻢ اﻹﻏﻼق ﺑﺎﺳﺘﺨﺪام اﻟﺪاﻟﺔ closedirأي ﺗﻢ إﺟﺮاء ﻋﻤﻠﻴﺎت أﺧﺮى ﺛﻢ
اﻟﻌﻮدة ﻟﻠﻘﺮاءة ﻣﺮة أﺧﺮى ﻣﻦ اﻟﻤﺠﻠﺪ ﻓﺈن اﻟﻤﺆﺷﺮ اﻻﻓﺘﺮاﺿﻲ ) (Virtual Pointerﺳﻴﻜﻮن ﻳﺸﻴﺮ إﻟﻰ أﺧﺮ ﻣﻠﻒ أو ﻣﺠﻠﺪ ﺿﻤﻦ اﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﻨﺎ
ﺑﻔﺘﺤﻪ وﻟﻢ ﻧﻐﻠﻘﻪ ﻋﻨﺪهﺎ ﻳﺠﺐ ﻋﻠﻴﻚ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ rewinddirﻹرﺟﺎع اﻟﻤﺆﺷﺮ اﻻﻓﺘﺮاﺿﻲ إﻟﻰ أول ﻣﻠﻒ أو ﻣﺠﻠﺪ ﺿﻤﻦ اﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﻨﺎ
ﺑﻔﺘﺤﻪ وذﻟﻚ إذا ﻟﻢ ﺗﻘﻢ ﺑﺈﻏﻼق اﻟﻤﺠﻠﺪ ﺑﺎﺳﺘﺨﺪام اﻟﺪاﻟﺔ . closedir
وﺳﺘﻜﻮن اﻟﺪاﻟﺔ rewinddirهﻲ ﻣﺤﻮر ﺣﺪﻳﺜﻨﺎ ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ ﻓﻲ اﻟﺼﻔﺤﺔ اﻟﻘﺎدﻣﺔ .
rewinddir
وﻇﻴﻔﺔ هﺬﻩ اﻟﺪاﻟﺔ هﻲ إرﺟﺎع ﻣﺆﺷﺮ اﻟﻘﺮاءة اﻹﻓﺘﺮاﺿﻲ ﻟﻴﺸﻴﺮ إﻟﻰ أول ﻣﻠﻒ أو ﻣﺠﻠﺪ ﻣﻮﺟﻮد ﺿﻤﻦ اﻟﻤﺠﻠﺪ اﻟﺬي ﻓﺘﺤﻨﺎﻩ ﺑﻮاﺳﻄﺔاﻟﺪاﻟﺔ
opendirوذﻟﻚ ﻗﺒﻞ اﻏﻼق اﻟﻤﺠﻠﺪ ﻓﻠﻮ اﻏﻠﻖ اﻟﻤﺠﻠﺪ ﺛﻢ ﻓﺘﺤﺘﻪ ﻣﺮة اﺧﺮى ﻓﺈن اﻟﺪاﻟﺔ opendirاﺻﻼً ﺗﻀﻊ اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ ﻋﻨﺪ اول ﻣﻠﻒ
داﺧﻞ اﻟﻤﺠﻠﺪ وﻟﻜﻦ ﺳﺒﺐ اﺳﺘﺨﺪام هﺬﻩ اﻟﺪاﻟﺔ ﻟﻪ ﺣﺎﻻت ﻋﺪة ﻣﻨﻬﺎ ﻧﺬآﺮ ﻋﻠﻰ ﺳﺒﻴﻞ اﻟﻤﺜﺎل ﻟﻮآﺎن ﻟﺪﻳﻚ ﻣﺠﻠﺪ وأردت اﻟﻘﺮاءة ﻣﻨﻬﺎ ﺛﻢ ﻗﺮأت
ﺟﻤﻴﻊ ﻣﺎﺑﺪاﺧﻠﻪ ﻣﻦ ﻣﻠﻔﺎت وﻣﺠﻠﺪات ﺑﺈﺳﺘﺨﺪام ﺣﻠﻘﺔ whileﻣﺜﻼً ﺛﻢ وﺻﻠﺖ اﻟﻰ اﺧﺮ ﻣﻠﻒ ﺿﻤﻦ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وﺑﻌﺪ ذﻟﻚ اﻧﺖ ﻻﺗﺮﻳﺪ اﻏﻼق
اﻟﻤﺠﻠﺪ ﺑﺪاﻟﺔ closedirﺑﻞ ﺗﺮﻳﺪ اﺟﺮاء ﺑﻌﺾ اﻟﻌﻤﻠﻴﺎت ﻋﻠﻰ اﻟﻤﻠﻔﺎت ﻓﻴﺠﺐ ﻋﻠﻴﻚ إرﺟﺎع اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ ﻷول ﻣﻠﻒ ﻓﻲ اﻟﻤﺠﻠﺪ اﻟﺬي ﻓﺘﺤﻨﺎﻩ
ﺑﺎﻟﺪاﻟﺔ opendirو rewinddirهﻲ اﻟﺪاﻟﺔ اﻟﻤﺨﺼﺼﺔ ﻹرﺟﺎع اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ ) (Virtual Pointerواﻟﺬي ﺷﺮﺣﻨﺎﻩ ﺳﺎﺑﻘﺎً .
وهﺬﻩ اﻟﺪاﻟﺔ ﺗﺸﺒﻪ إﻟﻰ ﺣﺪ آﺒﻴﺮ )ﺑﻞ ﺗﺴﺘﻄﻴﻊ ان ﺗﻘﻮل اﻧﻬﺎ ﻣﺜﻞ( اﻟﺪاﻟﺔ resetاﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺼﻔﻮﻓﺎت ) (arrayﻓﺎﻟﺪاﻟﺔ resetﺗﻘﻮم ﺑﺈرﺟﺎع
اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ اﻟﺨﺎص ﺑﺎﻟﻤﺼﻔﻮﻓﺔ إﻟﻰ أول ﻋﻨﺼﺮ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ .
ﻓﻠﻮ ﺗﺨﻠﻴﺖ اﻵن ان اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح ﻋﺒﺎرة ﻋﻦ ﻣﺼﻔﻮﻓﺔ ﻓﺈﻧﻚ ﺳﺘﻔﻬﻢ اﻟﺪاﻟﺔ rewinddirﺑﺴﻬﻮﻟﺔ
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﺗﺄﺧﺬ ﺑﺎراﻣﺘﺮ واﺣﺪ آﺎﻟﺘﺎﻟﻲ :
dirhandle
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (dirhandleﻳﺴﺘﺨﺪم ﻟﺘﺤﺪﻳﺪ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ ﻓﺘﺤﻪ ﺑﺎﻟﺪاﻟﺔ opendirﻓﻜﻤﺎ ﺗﻼﺣﻆ ان ) (dirhandleهﻮ ﻣﻦ ﻧﻮع
) (resourceوهﻲ ﻧﻔﺲ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﺗﻌﻴﺪهﺎ اﻟﺪاﻟﺔ opendirواﻟﺘﻲ ﻳﺘﻢ اﻹﺣﺘﻔﺎظ ﺑﻬﺎ ﻓﻲ ﻣﺘﻐﻴﺮ و إذا اﻧﺘﻬﺖ اﻟﻌﻤﻠﻴﺎت ﻋﻠﻰ اﻟﻤﺠﻠﺪ ﻳﺘﻢ ﺗﻤﺮﻳﺮ
اﻟﻤﺘﻐﻴﺮ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح إﻟﻰ اﻟﺪاﻟﺔ rewinddirﻹرﺟﺎع اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ إﻟﻰ أول ﻣﻠﻒ ﻓﻲ اﻟﻤﺠﻠﺪ .
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻻﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻓﺎﻟﻨﻮع اﻟﻤﻜﺘﻮب هﻮ ) (voidوﺗﺘﺮﺟﻢ ﻓﻲ ﺑﻌﺾ اﻟﻜﺘﺐ ﻋﻠﻰ اﻧﻬﺎ ﻧﻮع
ﻋﻘﻴﻢ أي ﻻ ﻳﻔﻌﻞ ﺷﻴﺌﺎً وﻳﺸﻴﺮون ﻟﻬﺎ ﻓﻲ اﻟﻜﺘﺐ اﻹﻧﺠﻠﻴﺰﻳﺔ ﺑﻜﻠﻤﺔ ) (nothingأي ﻻ ﺷﺊ .
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
ﻋﻠﻰ اﻓﺘﺮاض ان اﻟﻤﺠﻠﺪ اﻟﺬي ﺳﺄﻓﺘﺤﻪ هﻮ )" ("home/images/وﻳﺤﺘﻮي هﺬا اﻟﻤﺠﻠﺪ ﻋﻠﻰ اﻟﻤﻠﻔﺎت اﻟﺘﺎﻟﻴﺔ :
Abdullah.gif -١
eid.swf -٢
;)"$dhand = @opendir("home/images/
)if(!$dhand
ً ﻟﻘﺪ ﺗﻌﺬر ﻓﺘﺢ اﺠﻤﻟﻠﺪ"(die
;)"ﻋﺬرا
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻠﻘﺪ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻟﻔﺘﺢ ﻣﺠﻠﺪ ﺧﺎص ﺑﺎﻟﺼﻮر اﺳﻤﻪ home/images/
وإﻋﺎدة اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﻣﺘﻐﻴﺮ ﺑﺈﺳﻢ dhandواﻟﺬي ﺳﻴﻤﺜﻞ ﻣﻘﺒﺾ اﻹﺗﺼﺎل ﺑﺎﻟﻤﺠﻠﺪ .
وﺑﻌﺪ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirﻳﺠﺐ ﻋﻠﻴﻨﺎ اﺧﺘﺒﺎر اﻟﻨﺘﻴﺠﺔ اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﻤﺘﻐﻴﺮ dhandﻟﻤﻌﺮﻓﺔ ﺣﺎﻟﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ )هﻞ هﻲ ﻧﺎﺟﺤﺔ ام ﻓﺸﻠﺖ
ﻋﻤﻠﻴﺔ ﻓﺘﺢ اﻟﻤﺠﻠﺪ( ﺣﻴﺚ ﻗﻤﻨﺎ ﺑﻮﺿﻊ ﺟﻤﻠﺔ ifواﻟﺘﺄآﺪ ﻣﻦ ﻧﺠﺎح اﻟﺪاﻟﺔ او ﻓﺸﻠﻬﺎ وﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ اﺳﺘﺨﺪﻣﻨﺎ اﻟﺪاﻟﺔ dieﻟﻄﺒﺎﻋﺔ رﺳﺎﻟﺔ
ﻟﻠﻤﺴﺘﺨﺪم وإﻧﻬﺎء اﻟﺴﻜﺮﺑﺖ اﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻨﺠﺎح ﻓﺈﻧﻪ ﻳﻤﻜﻨﻚ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﺘﻐﻴﺮ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻘﺒﺾ
اﻹﺗﺼﺎل وهﻮ اﻟﻤﺘﻐﻴﺮ . dhand
واﻵن إذا ﻧﺠﺢ ﻓﺘﺢ اﻟﻤﺠﻠﺪ ﻓﺈﻧﻪ ﺳﺘﺘﻢ اﻹﺷﺎرة إﻟﻰ أو ﻣﻠﻒ ﻓﻲ اﻟﻤﺠﻠﺪ ﺑﻮاﺳﻄﺔ اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ وﺳﻴﻜﻮن أول ﻣﻠﻒ هﻮ Abdullah.gifﻓﺴﺘﻘﺮأ
اﻟﺪاﻟﺔ readdirاﺳﻢ اﻟﻤﻠﻒ اﻷول وﺗﺨﺰﻧﻪ ﻓﻲ اﻟﻤﺘﻐﻴﺮ fileوﺑﻌﺪ ذﻟﻚ ﻳﺘﻢ اﻟﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ fileﻓﻲ ﻧﻔﺲ رأس اﻟﺤﻠﻘﺔ whileﺛﻢ ﻳﻄﺒﻊ
اﻟﻤﻠﻒ اﻷول وهﻮ Abdullah.gifﺛﻢ ﻳﻜﺮر اﻟﺤﻠﻘﺔ ﻓﻴﺠﺪ اﻟﻤﻠﻒ eid.swfوﻳﻄﺒﻌﻪ ﺛﻢ ﻳﻌﻴﺪ اﻟﺤﻠﻘﺔ وﻻﻳﺠﺪ ﺷﺊ ﻓﻴﻌﻴﺪ falseوﻳﻨﻬﻲ اﻟﺤﻠﻘﺔ . while
واﻵن ﺑﻌﺪ اﻧﺘﻬﺎء اﻟﺤﻠﻘﺔ ﻓﺈن اﻟﻤﺆﺷﺮ اﻹﻓﺘﺮاﺿﻲ ﻳﺸﻴﺮ إﻟﻰ اﺧﺮ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح ﻟﺬﻟﻚ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ rewinddirﻹﻋﺎدة اﻟﻤﺆﺷﺮ إﻟﻰ ﺑﺪاﻳﺔ
اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح وﻻﺣﻆ اﻧﻪ ﻟﻢ ﻧﻐﻠﻖ اﻟﻤﺠﻠﺪ ﺛﻢ ﺑﻌﺪ ذﻟﻚ ﻗﻤﺖ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ readdirﺑﺪون ﺣﻠﻘﺔ ﻟﻘﺮاءة اﻟﻤﻠﻒ اﻷول ﻓﻲ اﻟﻤﺠﻠﺪ وﺣﻔﻆ اﺳﻢ
اﻟﻤﻠﻒ ﻓﻲ اﻟﻤﺘﻐﻴﺮ xxﺛﻢ ﻃﺒﺎﻋﺘﻪ .
وﺑﻌﺪ ا ﺟﺮاء اﻟﻌﻤﻠﻴﺎت ﻋﻠﻰ اﻟﻤﺠﻠﺪ و اﻹﻧﺘﻬﺎء ﻣﻨﻪ ﺗﻢ إﻏﻼق اﻟﻤﺠﻠﺪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ closedirوذﻟﻚ
ﺑﺘﻤﺮﻳﺮ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح إﻟﻴﻬﺎ ﻹﻏﻼﻗﻪ .
وهﻜﺬا أرﺟﻮا أن ﺗﻜﻮن ﻓﻜﺮة اﻟﺪاﻟﺔ rewinddirﻗﺪ وﺻﻠﺖ إﻟﻰ ذهﻨﻚ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ .
scandir
ﺗﺴﺘﺨﺪم هﺬﻩ اﻟﺪاﻟﺔ ﺑﺸﻜﻞ ﻓﺮدي أي دون اﺳﺘﺨﺪام أي داﻟﺔ ﻣﻌﻬﺎ ﻣﺜﻞ opendirاو closedirاﻳﻀﺎً ﻓﻤﻬﻤﺔ هﺬﻩ اﻟﺪاﻟﺔ هﻲ ﻗﺮاءة ﻣﺠﻠﺪ
ﺑﺎﻟﻜﺎﻣﻞ ووﺿﻌﻪ ﺿﻤﻦ ﻣﺼﻔﻮﻓﺔ آﻞ ﻋﻨﺼﺮ ﻓﻴﻬﺎ ﻳﺤﺘﻮي ﻋﻠﻰ اﺳﻢ ﻣﻠﻒ أو ﻣﺠﻠﺪ ﻣﻮﺟﻮد ﺿﻤﻦ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻌﺎﻣﻠﻨﺎ ﻣﻌﻪ ﺑﺈﺳﺘﺨﺪام scandir
ﻣﻼﺣﻈﺔ
ﻟﻘﺪ ﺗﻢ دﻋﻢ اﻟﺪاﻟﺔ scnadirوإﺿﺎﻓﺘﻬﺎ إﻟﻰ ﻣﻜﺘﺒﺔ Directory Function Libraryﻓﻲ . PHP 5
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﻓﺈﻧﻬﺎ ﺗﺄﺧﺬ ﺛﻼث آﺎﻟﺘﺎﻟﻲ :
directory
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (directoryوهﻮ ﻣﻦ ﻧﻮع ) (stringأي ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ وﻳﺘﻢ ﻓﻴﻪ ﺗﺤﺪﻳﺪ ﻣﺴﺎر اﻟﻤﺠﻠﺪ اﻟﻤﺮاد ﻗﺮاءﺗﻪ .
sorting
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (sortingوهﻮ ﻣﻦ ﻧﻮع ) (intأي ﻣﺘﻐﻴﺮ ﻋﺪدي )رﻗﻤﻲ( وهﺬا اﻟﺒﺎراﻣﺘﺮ اﻓﺘﺮاﺿﻲ أي ﺑﺈﻣﻜﺎﻧﻚ وﺿﻌﻪ او ﺗﺠﺎهﻠﻪ و أﻣﺎ
اﻟﻬﺪف ﻣﻦ هﺬا اﻟﺒﺎرﻣﺘﺮ ﻓﻬﻮ ﻟﺘﺤﺪﻳﺪ ﻃﺮﻳﻘﺔ ﺗﺮﺗﻴﺐ اﻟﻤﻠﻔﺎت ﺿﻤﻦ اﻟﻤﺼﻔﻮﻓﺔ ﻓﻬﻞ هﻮ ﺗﺼﺎﻋﺪي او ﺗﻨﺎزﻟﻲ ﻓﺈذا ﺗﻢ ﺗﺮك هﺬا اﻟﺒﺎرﻣﺘﺮ وﻟﻢ
ﻳﺰود ﺑﻘﻴﻤﺔ ﻓﺈﻧﻪ ﺳﻴﻘﻮم ﺑﺘﺮﺗﻴﺐ اﻟﻤﺼﻔﻮﻓﺔ ﺑﺸﻜﻞ ﺗﺼﺎﻋﺪي اﻣﺎ اذا اﻋﻄﻴﺘﻪ اﻟﻘﻴﻤﺔ ١ﻓﺈﻧﻪ ﺳﻴﺮﺗﺒﻪ ﺑﺸﻠﻚ ﺗﻨﺎزﻟﻲ ﺣﺴﺐ اﺳﻤﺎء اﻟﻤﻠﻔﺎت
هﺠﺎﺋﻴﺎً .
context
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (contextوهﻮ ﻣﻦ ﻧﻮع ) (resourceوهﻮ اﻓﺘﺮاﺿﻲ اﻳﻀﺎً وﻟﻜﻦ ﻟﻢ أﺟﺪ ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﻟﻬﺬا اﻟﺒﺎراﻣﺘﺮ ﺿﻤﻦ php Documention
ﻓﻘﺪ ﻳﻜﻮن هﺬا اﻟﺒﺎرﻣﺘﺮ ﺗﻢ وﺿﻌﻪ ﻷﻏﺮاض ﻣﺴﺘﻘﺒﻠﻴﺔ .
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ اﻟﻨﻮع ) (boolوهﻲ ﻗﻴﻤﺔ ﺑﻮﻟﻴﺎﻧﻴﺔ وﻟﺬﻟﻚ ﺳﺘﻜﻮن اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﺣﺎﻟﺔ
ﻧﺠﺎح ﺗﻐﻴﻴﺮ اﻟﻤﺠﻠﺪ اﻟﻨﺸﻂ هﻲ TRUEأﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ ﻓﻬﻲ . FALSE
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
ﺳﺄﻗﻮم ﺑﻔﺘﺢ اﻟﻤﺠﻠﺪ )" ("/tmp/وﻗﺮاءة آﺎﻣﻞ اﻟﻤﻠﻔﺎت واﻟﻤﺠﻠﺪات اﻟﻤﻮﺟﻮدة ﻓﻴﻪ و ﺣﻔﻈﻬﺎ ﺿﻤﻦ ﻣﺼﻔﻮﻓﺔ اﻷوﻟﻰ ﻣﺮﺗﺒﺔ ﺗﺼﺎﻋﺪﻳﺎً واﻟﺜﺎﻧﻴﺔ ﺳﺄﻗﺮأ
اﻟﻤﺠﻠﺪ وارﺗﺒﻬﺎ ﺗﻨﺎزﻟﻴﺎً وذﻟﻚ ﺑﺈﻋﻄﺎء اﻟﺒﺎرﻣﺘﺮ sortingاﻟﻘﻴﻤﺔ . ١ﺛﻢ ﺳﺄﻃﺒﻊ اﻟﻤﺼﻔﻮﻓﺘﻴﻦ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ print_rاﻟﺨﺎﺻﺔ ﺑﻄﺒﺎﻋﺔ اﻟﻤﺼﻔﻮﻓﺎت
;)print_r($files1
;)print_r($files2
و آﻤﺎ ﺗﺮى ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻲ اﻟﻤﺜﺎل اﻟﻤﻮﺟﻮد ﻓﻲ اﻷﻋﻠﻰ ﻓﻠﻘﺪ وﺿﻌﻨﺎ ﻣﺴﺎر اﻟﻤﺠﻠﺪ ﻓﻲ ﻣﺘﻐﻴﺮ ﺑﺈﺳﻢ dirﺛﻢ اﺳﺘﺨﺪﻣﻨﺎ اﻟﺪاﻟﺔ scandirﺑﻔﺮز
ﺗﺼﺎﻋﺪي ووﺿﻌﻨﺎ اﻟﻤﺼﻔﻮﻓﺔ ﻓﻲ اﻟﻤﺘﻐﻴﺮ files1ﺛﻢ ﺑﻨﻔﺲ اﻟﻄﺮﻳﻘﺔ اﺳﺘﺨﺪﻣﻨﺎ اﻟﺪاﻟﺔ scandirﻟﻘﺮاء اﻟﻤﺠﻠﺪ وﻟﻜﻦ ﺑﻔﺮز ﺗﻨﺎزﻟﻲ وﺗﺨﺰﻳﻦ اﻟﻤﺼﻔﻮﻓﺔ
ﻓﻲ اﻟﻤﺘﻐﻴﺮ fiels2ﺛﻢ ﺑﻌﺪ ذﻟﻚ ﻃﺒﻌﻨﺎ آﻼ اﻟﻤﺼﻔﻮﻓﺘﻴﻦ وإﻟﻴﻚ اﻟﻨﺘﻴﺠﺔ
Array //files1
(
[0] => .
[1] => ..
[2] => bar.php
[3] => foo.txt
[4] => somedir
)
Array //files2
(
][0 >= somedir
][1 >= foo.txt
][2 >= bar.php
][3 >= ..
][4 >= .
)
OOPوﻣﻜﺘﺒﺔ Directory Function Library
ﻋﺰﻳﺰي اﻟﻘﺎرئ ﺑﻘﻲ ﺷﺊ اﺧﻴﺮ اﻗﻮﻟﻪ وهﻮ ان هﺬﻩ اﻟﻤﻜﺘﺒﺔ ﺗﺤﺘﻮي ﻋﻠﻰ classﺑﺈﺳﻢ dirوهﺬا اﻟﻜﻼس ﻳﺴﺘﺨﺪم ﺑﻌﺾ اﻟﺪوال اﻟﺘﻲ ﺷﺮﺣﻨﺎهﺎ
وﻳﻘﻮم ﺑﺘﻐﻠﻴﻔﻬﺎ ﻓﻘﻂ وهﺬا اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻠﻜﺎﺋﻦ .
{ class dir
string path
resource handle
}
أي ﻟﻦ ﺗﺤﺘﺎج ﻟﺘﻌﻠﻢ ﺷﺊ ﺟﺪﻳﺪ ﻓﻘﻂ ﺳﺘﺴﺘﺨﺪم اﻟﺪوال اﻟﺘﻲ ﺗﻌﻠﻤﻨﺎهﺎ وﻟﻜﻦ ﺑﺈﺧﺘﻼف ﺑﺴﻴﻂ ﺣﻴﺚ ان هﺬا اﻟﻜﺎﺋﻦ ﻳﺘﺤﺘﻮي ﺑﺪاﺧﻠﻪ ﻋﻠﻰ ﻣﺘﻐﻴﺮ
ﻳﺤﺘﻔﻆ ﺑﻤﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح ﻳﻌﻨﻲ ان اﻟﺪوال اﻟﺘﻲ ﺗﺤﺘﺎج اﻟﻰ اﻟﻤﻘﺒﺾ آﺒﺎرﻣﺘﺮ ﻟﻬﺎ ﺿﻤﻦ ﻣﻜﺘﺒﺔ اﻟﺪوال ﻓﺈن دوال اﻟﻜﺎﺋﻦ ﻻ ﺗﺤﺘﺎج ﻟﺘﻤﺮﻳﺮ هﺬا
اﻟﺒﺎراﻣﺘﺮ ﻟﻬﺎ ﻷﻧﻬﺎ ﺗﺤﺘﻔﻆ ﺑﻪ ﻓﻲ داﺧﻞ اﻟﻜﺎﺋﻦ وأﻧﺎ أﻋﺮف ان هﺬا اﻟﻜﻼم ﻗﺪ ﻳﻜﻮن ﺻﻌﺐ أو ﻏﻴﺮ ﻣﻔﻬﻮم ﻧﻮﻋﺎً ﻣﺎ وﻟﻜﻦ ﺳﺄرﻳﻚ اﻟﻄﺮﻳﻘﺔ ﺑﺈذن اﷲ .
اﻟﻤﺘﻐﻴﺮ pathهﻮ ﻣﻦ ﻧﻮع stringأي ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ وهﻮ ﻳﺤﺘﻔﻆ ﺑﻤﺴﺎر اﻟﻤﺠﻠﺪ اﻟﺬي ﻣﺮرﻧﺎﻩ ﻟﻪ .
اﻧﻈﺮ إﻟﻰ اﻟﻤﺘﻐﻴﺮ handleاﻟﻤﻮﺟﻮد ﺑﺎﻷﻋﻠﻰ ﻓﻬﻮ ﻳﻤﺜﻞ ﻣﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح واﻧﻈﺮ إﻟﻰ داﻟﺔ readداﻟﺔ rewindو closeﻓﺈﻧﻬﺎ ﻻﺗﺤﺘﺎج إﻟﻰ
ﺗﻤﺮﻳﺮ ﻣﻘﺒﺾ اﻹﺗﺼﺎل آﻤﺎ آﻨﺎ ﻧﻔﻌﻞ ﻣﻊ دوال اﻟﻤﻜﺘﺒﺔ واﻟﺴﺒﺐ هﻮ ان اﻟﻜﺎﺋﻦ ﻳﺤﺘﻔﻆ ﺑﻤﻘﺒﺾ اﻟﻤﺠﻠﺪ اﻟﻤﻔﺘﻮح ﻓﻲ اﻟﻤﺘﻐﻴﺮ handl
وﻟﻔﺘﺢ اﻟﻤﺠﻠﺪ اﺳﺘﺨﺪم dirﻣﻊ ﻣﺴﺎر اﻟﻤﺠﻠﺪ ﺑﻴﻦ ﻗﻮﺳﻴﻦ واﺣﺘﻔﻆ ﺑﺎﻟﻘﻴﻤﺔ ﺿﻤﻦ ﻣﺘﻐﻴﺮ واﻟﺬي ﺳﻴﻤﺜﻞ اﻟﻜﺎﺋﻦ وإﻟﻴﻚ ﻣﺜﺎل .
;)"$d = dir("/etc
;"echo "Handle: " . $d->handle . "<br />\n
;"echo "Path: " . $d->path . "<br />\n
{ )))(while (false !== ($entry = $d->read
;"echo $entry."<br />\n
}
;)($d->close
ﻻﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻣﻦ اﻟﻤﺜﺎل ﻓﻲ اﻷﻋﻠﻰ ﻓﻠﻘﺪ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﻜﻼس dirوﻣﺮرﻧﺎ اﻟﻤﺠﻠﺪ اﻟﻤﺮاد ﻓﺘﺤﻪ ﺛﻢ ﺣﻔﻈﻨﺎ اﻟﻘﻴﻤﺔ ﺿﻤﻦ ﻣﺘﻐﻴﺮ ﺑﺈﺳﻢ d
وﺑﻌﺪ ذﻟﻚ ﺳﻬﻠﺖ اﻟﻌﻤﻠﻴﺔ ﻓﻜﻞ ﻣﺎﻋﻠﻴﻚ هﻮ اﺳﺘﺪﻋﺎء دوال اﻟﻜﺎﺋﻦ ﻓﻘﻂ ﻓـ readﻟﻠﻘﺮاءة وهﻲ ﻧﻔﺴﻬﺎ اﻟﺪاﻟﺔ readdirوﻟﻜﻦ ﺑﻌﺪ اﺟﺮاء ﻋﻤﻠﻴﺔ ﻓﺒﺮآﺔ
ﺑﺴﻴﻄﺔ ﻋﻠﻴﻬﺎ .
وأرﺟﻮا أن ﺗﻜﻮن اﻟﻔﻜﺮة اﻟﺨﺎﺻﺔ ﺑﺎﻟﻜﺎﺋﻦ ﻗﺪ وﺻﻠﺖ إﻟﻰ ذهﻨﻚ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ .
is_dir
هﺬﻩ اﻟﺪاﻟﺔ ﻏﻴﺮ ﻣﺪرﺟﺔ ﺿﻤﻦ ﻣﻜﺘﺒﺔ Directory Function Libraryوﻟﻜﻦ ﺗﺴﺘﺨﺪم ﺑﻜﺜﺮة ﻣﻊ هﺬﻩ اﻟﻤﻜﺘﺒﺔ وﻓﺎﺋﺪﺗﻬﺎ هﻲ اﻧﻚ ﺗﻘﻮم ﺑﺘﻤﺮﻳﺮ ﻣﺴﺎر
ﺧﺎص ﺑﻤﺠﻠﺪ ﻣﻌﻴﻦ ﻓﺘﺘﺄآﺪ هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ ان هﺬا اﻟﻤﺴﺎر هﻮ ﻣﺠﻠﺪ او ﻻ ﻓﺈذا آﺎن ﻣﺠﻠﺪ ﻓﺈﻧﻬﺎ ﺗﺮﺟﻊ اﻟﻘﻴﻤﺔ TRUEوإذا ﻟﻢ ﻳﻜﻦ ﻣﺠﻠﺪ ﺗﺮﺟﻊ اﻟﻘﻴﻤﺔ
FALSEوهﺬا ﻣﻔﻴﺪ ﺟﺪاً إذا ﻳﺠﺐ اﺳﺘﺨﺪام هﺬﻩ اﻟﺪاﻟﺔ ﻗﺒﻞ اﺟﺮاء ﻋﻤﻠﻴﺔ ﻓﺘﺢ ﻟﻠﻤﺠﻠﺪ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ opendirوذﻟﻚ ﻟﻠﺘﺄآﺪ ﻗﺒﻞ إﺟﺮاء ﻋﻤﻠﻴﺔ
اﻟﻔﺘﺢ .
اﻟﺒﺎراﻣﺘﺮات
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﺈن اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﻟﻬﺎ ﻓﺈﻧﻬﺎ ﺗﺄﺧﺬ ﺑﺎرﻣﺘﺮ واﺣﺪ آﺎﻟﺘﺎﻟﻲ :
directory
وهﺬا اﻟﺒﺎراﻣﺘﺮ ) (directoryوهﻮ ﻣﻦ ﻧﻮع ) (stringأي ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ وﻳﺘﻢ ﻓﻴﻪ ﺗﺤﺪﻳﺪ اﻟﻤﺴﺎر اﻟﻤﺮاد اﻟﺘﺄآﺪ ﻣﻦ أﻧﻪ ﻣﺠﻠﺪ او ﻻ .
ﻗﻴﻤﺔ اﻹﻋﺎدة
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰ ي اﻟﻘﺎرئ ﻓﺈن هﺬﻩ اﻟﺪاﻟﺔ ﻣﻦ اﻟﺼﻮرة اﻟﻌﺎﻣﺔ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ﻣﻦ اﻟﻨﻮع ) (boolوهﻲ ﻗﻴﻤﺔ ﺑﻮﻟﻴﺎﻧﻴﺔ وﻟﺬﻟﻚ ﺳﺘﻜﻮن اﻟﻨﺘﻴﺠﺔ ﻓﻲ ﺣﺎﻟﺔ
ﻧﺠﺎح ﺗﻐﻴﻴﺮ اﻟﻤﺠﻠﺪ اﻟﻨﺸﻂ هﻲ TRUEأﻣﺎ ﻓﻲ ﺣﺎﻟﺔ اﻟﻔﺸﻞ ﻓﻬﻲ . FALSE
ﻣﺜﺎل اﻹﺳﺘﺨﺪام
))"if(!is_dir("home/images/
ً اﳌﺴﺎر اﶈﺪد ﻻﳝﺜﻞ ﳎﻠﺪ"(die
;)"ﻋﺬرا
//else output is : home/images/
آﻤﺎ ﺗﻼﺣﻆ ﻋﺰﻳﺰي اﻟﻘﺎرئ ﻓﻠﻘﺪ ﻗﻤﻨﺎ ﺑﺈﺳﺘﺨﺪام اﻟﺪاﻟﺔ is_dirﻓﻲ اﻟﺒﺪاﻳﺔ ﻟﻠﺘﺄآﺪ ﻣﻦ أن اﻟﻤﺴﺎر اﻟﻤﻤﺮر ﻳﻤﺜﻞ ﻣﺠﻠﺪ او ﻻ ﻓﺈذا آﺎن ﻻﻳﻤﺜﻞ ﻣﺠﻠﺪ ﻳﺘﻢ
إﻧﻬﺎء اﻟﺴﻜﺮﺑﺖ و إﻋﻄﺎء اﻟﻤﺴﺘﺨﺪم رﺳﺎﻟﺔ ﺗﻔﻴﺪ ﺑﺄن اﻟﻤﺴﺎر اﻟﻤﺤﺪد ﻻﻳﻤﺜﻞ ﻣﺠﻠﺪ ﺻﺤﻴﺢ او ﺗﻜﻤﻞ ﺑﺎﻗﻲ اﻟﺴﻜﺮﺑﺖ ﻓﻲ ﺣﺎل آﺎن اﻟﻤﺴﺎر اﻟﻤﺤﺪد
ﻟﻠﺪاﻟﺔ is_dirهﻮ ﻣﺠﻠﺪ ﺻﺤﻴﺢ .
ﻣﺜﺎل ﺷﺎﻣﻞ
. هﻨﺎ ﻓﻲ هﺬﻩ اﻟﻔﻘﺮة اﻷﺧﻴﺮة ﺳﺄﻋﻄﻲ ﻣﺜﺎل ﺷﺎﻣﻞ ﻟﻤﺎ ﺗﻤﺖ دراﺳﺘﻪ وﺳﻴﻜﻮن ﻣﻔﻴﺪ ﺑﺈذن اﷲ ﺗﻌﺎﻟﻰ
<?php
$dir = "/tmp/";
ﻭﻟﻴﺲ ﺃﺧﺮﺍً ﺃﺭﺟﻮﺍ ﺃﻥ ﺗﻜﻮﻥ ﻗﺪ ﺍﺳﺘﻔﺪﺕ ﻣﻦ ﻫﺬﺍ ﺍﻟﻜﺘﻴﺐ ﻭﺃﺭﺟﻮﺍ ﻣﻨﻚ ﺍﻟﺪﻋﺎﺀ ﱄ ﰲ ﻇﻬﺮ
ﺍﻟﻐﻴﺐ ﻭﻛﻤﺎ ﺫﻛﺮنﺎ ﺳﺎﺑﻘﺎً ﻓﺈﻥ ﺍﻟﺴﻠﺴﻠﺔ ﺳﺘﺴﺘﻤﺮ ﲠﺬﺍ ﺍﻟﻨﻤﻂ ﺣﺴﺐ ﺍﻟﻮﻗﺖ ﺍﳌﺘﻮﻓﺮ ﱄ ﻭ
ﻭﺑﻌﺪ ﺍنﺘﻬﺎﺋﻲ ﻣﻦ ﳎﻤﻮﻋﺔ ﻣﻦ ﺍﻟﻜﺘﻴﺒﺎﺕ ﺳﺄﻗﻮﻡ ﺑﻀﻤﻬﺎ ﲢﺖ ﻛﺘﺎﺏ ﻭﺍﺣﺪ ﺑﺈﺫﻥ ﺍﻪﻠﻟ