Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1566701
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2011-09-15 10:30:56

想必大家在学完了【递归】以后,有的人还是很朦胧,也不乏有的人抽象逻辑思维很强弄的很明白。在这里,我带着你一起去用计算机的逻辑思维,我们一步一步按计算机执行程序的顺序来推理整个递归过程。也许你在看完之后会恍然大悟,也许你是个高手不屑一顾,在这,我只想真诚的说一句,我分享的不是一种技术,我的技术没那么好(菜鸟),我分享的是一种思想,与大家共同交流,探讨的一种精神。OK,有点罗嗦,那我就再罗嗦一会。
上课时,文凯老师用电影《盗梦空间》的故事为我们上了一堂课,生动、形象的推理了递归理论。没看过盗梦空间的兄弟,也别悔之晚矣,没关系 看下面。



现实生活 ------> 一层梦境----------->二层梦境----------->三层梦境------->四层梦境
现实生活 ← 一层梦境 ← 二层梦境 ← 三层梦境 ← 四层梦境



声明: 1.我们推理的是一个统计文件夹大小的递归函数(自定义的)。
2.推理的文章,包括源代码、工具、文件夹,我已经压缩打包在附件,推理的文章在demo.php 、
递归函数源代码在demosource.php 中,参照源代码demosource.php 来看demo.php 。
3.把压缩包里的php这个文件夹一定要放到你网站的根目录
4.压缩包里含有说明文档,在推理之前,先看说明文档。
5.如果你觉得论坛上看着不方便,完全可以下载附件。推荐用editplus软件可以并排窗口更方便查看代码

ps:本文章乃个人逻辑推理的产物,不乏有误解之处,但请放心看我的文章,文章里的每一处代码我都亲身用函数检测了一遍,代码执行上是没有问题的。
本人真诚的希望各位老师、学长,兄弟姐妹,如果推理中存在疑点和误点,欢迎您的改正和指教。(回复本帖)

递归函数 源代码,此函数的功能是统计一个文件夹的大小

  1. function blldir($path){
  2. $res=opendir($path);
  3. readdir($res);
  4. readdir($res);
  5. while($filename=readdir($res)){
  6. $newpath=$path.'\\'.$filename;
  7. if(is_dir($newpath)){
  8. $count+=blldir($newpath);
  9. }else{
  10. $count+=filesize($newpath);
  11. }
  12. }
  13. closedir($res);
  14. return $count;
  15. }
  16. ?>
  17. /********************************************************************************
  18. +++++++按计算机执行程序顺序来解析递归的过程*****let's go,让我们走出逻辑迷宫+********************************************************************************/
  19. $path='D:\AppServ\www\php\720';//参数传进来
  20. $res=opendir($path); //opendir打开资源,并赋给$res
  21. readdir($res); //读取这个资源,返回目录和文件的名称。
  22. readdir($res); //两次readdir读取当前目录. 和..上级目录,让指针指到..位置
  23. //------------到这里开始进入循环//while($filename=readdir($res))-----------------//
  24. /*执行while条件判断,如果返回名称则条件为真执行循环,否则返回faslse,停止循环
  25. ----------------------------------
  26. while($filename=readdir($res)){ 这里我们把循环结构改一下,看看到底$filename被赋予神马 东西了
  27. var_dump($filename); 用var_dump函数来查看$filename到底被赋予了哪些值,看见没
  28. echo '
    '; string(8) "file.php" <---------文件名
  29. string(12) "filefunc.php" <---------文件名
  30. } string(9) "opdir.php" <---------文件名
  31. -----------------------------------
  32. 右边输出的都是目录下文件、文件夹名string(2) "dd" <---------文件夹,注意
  33. 然后把这些文件名的字符串粘贴 string(6) "jc.php"
  34. 到$path这个字符串的后面,形成 string(8) "jsq.html"
  35. 我们要的绝对路径,因为即将执行 string(7) "jsq.php"
  36. 的is_dir()函数的参数必须是绝对 string(11) "include.php"
  37. 路径,你知道原因了吧 string(7) "del.php"
  38. string(8) "read.php"
  39. string(17) "displayfiles.html"
  40. string(8) "demo.php"
  41. string(12) "demo.php.bak"
  42. string(14) "demosource.php"
  43. string(18) "demosource.php.bak"
  44. ---------好,咱们先看看程序第一次循环是怎么执行的。----------------*/
  45. //这里我们把循环代码执行的过程按while循环执行的顺序单拿出来模拟执行。
  46. $filename=readdir($res);//while($filename=readdir($res))这里执行并赋值给$filename,进行判断真假
  47. $newpath=$path.'\\'.$filename;//根据以上判断,readdir($res)现在应该指向 file.php 这个文件
  48. //所以$newpath='D:\AppServ\www\php\720\file.php'
  49. /*if(is_dir($newpath)) 这里判断该路径是不是一个目录,因为,file.php是一个文件,不是目录,所以执行else后面的语句。我们单拿出来执行。*/
  50. $count+=filesize($newpath);//这条语句的功能是把文件的大小进行累加。
  51. /*好,到这里while循环语句结束了第一次循环,也许你会说,也未出现传说中的什么递归啊,那么,这是个很幼稚的想法,也许你性子很急,我们慢慢来。*/
  52. /*----------喝杯咖啡吧,为的是让你清醒,我们开始进行第二次以后的循环------------*/
  53. $filename=readdir($res);//while($filename=readdir($res))这里执行并赋值给$filename,进行判断真假
  54. $newpath=$path.'\\'.$filename;//根据以上判断,readdir($res)现在应该指向 filefunc.php 这个文件
  55. //所以$newpath='D:\AppServ\www\php\720\filefunc.php'
  56. //if(is_dir($newpath))进行判断为假,执行else区间语句
  57. $count+=filesize($newpath);//这条语句的功能是把文件的大小进行累加。
  58. /*---------第二次循环结束,也许你想法牢骚,这还没有递归啊,淡定--------*/
  59. /*---------第三次循环开始,这里我们不进行注释了,相信你已经知道结果--------*/
  60. $filename=readdir($res);
  61. $newpath=$path.'\\'.$filename;//根据以上判断,readdir($res)现在应该指向 opdir.php 这个文件
  62. $count+=filesize($newpath);
  63. /* 现在我们着重要看的就是$count的值。是三个文件 file.php 、filefunc.php 、opdir.php累加的结果吧,好,您通过循环得到了三个文件累加的结果,那么假如说,D:\AppServ\www\php\720 这个目录里面没有子目录的话,那么if(is_dir($newpath))为真时的语句就永远不会执行,也就是说,我们用$count累加的结果永远都是D:\AppServ\www\php\720这个目录下文件的大小之和。那么‘720’这个文件夹的大小理所当然就是$count的累加值。*/
  64. /*---------好,明白了以上道理,我们开始进入第四次循环,也就是传说中的递归------*/
  65. $filename=readdir($res); //这里指针应该指向 ‘dd’这个目录了吧(我电脑里的我清楚它是目录)。
  66. $newpath=$path.'\\'.$filename;//结合成完整的路径
  67. //if(is_dir($newpath)) 这里判断该路径是目录,执行真区间语句
  68. //$count+=blldir($newpath); <------执行这个语句
  69. /*-----做好准备,我带你进入盗梦空间,看你回得来回不来,我们要进入梦的第一层,惊魂------*/
  70. /* blldir($newpath);<---上面在累加语句中调用了函数本身,所以,函数的开始,就是我们进入梦的第一层的入口。请别忘了带着你来时候的陀螺,否则你会迷失,这个陀螺就是,$newpath,也就是你来时候的路径。$newpath='D:\AppServ\www\php\720\dd';---------*/
  71. /***********************************************************************************************
  72. 第一层梦开始了,我们执行该执行的任务
  73. ***********************************************************************************************/
  74. $res=opendir($newpath); //opendir打开资源,并赋给$res
  75. readdir($res); //读取这个资源,返回目录和文件的名称。
  76. readdir($res); //两次readdir读取当前目录. 和..上级目录,让指针指到..位置
  77. //------------到这里开始进入循环//while($filename=readdir($res))-----------------//
  78. /*执行while条件判断,如果返回名称则条件为真执行循环,否则返回faslse,停止循环
  79. ----------------------------------
  80. while($filename=readdir($res)){ 这里我们把循环结构改一下,看看到底$filename被赋予神马 东西了
  81. var_dump($filename); 用var_dump函数来查看$filename到底被赋予了哪些值,看见没
  82. echo '
    '; string(9) "file1.php" <----这个是文件
  83. string(6) "dream2" <-----这个是文件夹
  84. }
  85. -----------------------------------*/
  86. /*------在第一层梦境中(其实也就是进入dd这个文件夹了。)我们要干的事,也就是和我们开始讲的事是一模一样的,找出这个文件夹内的子文件夹 和 文件。如果碰到的是文件,if(is_dir($newpath))这个判断就为假,执行else区间的语句,其实就是干了一件事,把所有文件的大小累加到一起。如果碰到的是子文件夹,那好,if(is_dir($newpath))这个判断就为真,执行真区间的语句,而真区间的语句是调用函数本身,又重新开始遍历这个子文件夹的内容,所以,只要碰到文件夹,你就会进入下一层梦境(目录),进入下一层梦境,你又会进行if(is_dir($newpath))这个判断。如果有文件,就统计,如果是文件夹,就进入下一层梦境。按这个计算机的执行顺序来分析,你在每次遍历到文件夹的时候,else以后的语句都是暂不执行的,当你在一个文件夹中完成了所有遍历和统计大小,别忘了return的作用,它是将$count的值返回给你上一层梦境调用函数本身的地方。所以,每当遇到文件夹,就有一组else后面的$count+=filesize($newpath);和return $count;语句暂未执行。当你到达梦的最底层的时候,再也没有梦境(目录)可以进入了,那么在每层梦境中,那些暂未执行$count+=filesize($newpath);,会把未累加的文件累加完,return $count;语句然后把所在层的梦境所收获的东西(其实也就是$count;)返回到上一层梦境中你调用函数本身的地方,进行累加。
  87. !!!这里要注意,每次调用函数本身的时候,$count值初始化都为NULL,和后边进行运算时自动转化为O, 为什么为空这里不再赘诉,基本语法------------*/
  88. /*------上面的话听起来有些绕,下面我们一起来梦之旅-------------------*/
  89. /*---------好,咱们先看看程序第一次循环是怎么执行的。----------------*/
  90. //这里我们把循环代码执行的过程按while循环执行的顺序单拿出来模拟执行。
  91. $filename=readdir($res);//while($filename=readdir($res))这里执行并赋值给$filename,进行判断真假
  92. $newpath=$path.'\\dd\\'.$filename;//根据以上判断,readdir($res)现在应该指向 file1.php 这个文件
  93. //所以$newpath='D:\AppServ\www\php\720\dd\file1.php'
  94. /*if(is_dir($newpath)) 这里判断该路径是不是一个目录,因为,file1.php是一个文件,不是目录,所以执行else后面的语句。我们单拿出来执行。*/
  95. $count1+=filesize($newpath);//这条语句的功能是把文件的大小进行累加。
  96. /*---------第一次循环完毕,我们开始进入第二次循环,也就是传说中的递归------*/
  97. $filename=readdir($res); //这里指针应该指向 dream2这个目录了吧(我电脑里的我清楚它是目录)
  98. $newpath=$path.'\\dd\\'.$filename;//结合成完整的路径
  99. //if(is_dir($newpath)) 这里判断该路径是目录,执行真区间语句
  100. //$newpath='D:\AppServ\www\php\720\dd\dream2'
  101. //$count+=blldir($newpath); <------执行这个语句
  102. /*-----做好准备,我带你进入盗梦空间,看你回得来回不来,我们要进入梦的第二层,释然------*/
  103. /* blldir($newpath);<---上面在累加语句中调用了函数本身,所以,函数的开始,就是我们进入二层梦境的入口。请别忘了带着你来时候的陀螺,否则你会迷失,这个陀螺就是,$newpath,也就是你来时候的路径。$newpath='D:\AppServ\www\php\720\dd\dream2';---------*/
  104. /***********************************************************************************************
  105. 第二层梦开始了,我们执行该执行的任务
  106. ***********************************************************************************************/
  107. $res=opendir($newpath); //opendir打开资源,并赋给$res
  108. readdir($res); //读取这个资源,返回目录和文件的名称。
  109. readdir($res); //两次readdir读取当前目录. 和..上级目录,让指针指到..位置
  110. //------------到这里开始进入循环//while($filename=readdir($res))-----------------//
  111. /*执行while条件判断,如果返回名称则条件为真执行循环,否则返回faslse,停止循环
  112. ----------------------------------
  113. while($filename=readdir($res)){ 这里我们把循环结构改一下,看看到底$filename被赋予神马 东西了
  114. var_dump($filename); 用var_dump函数来查看$filename到底被赋予了哪些值,看见没
  115. echo '
    '; string(6) "dream3" <----这个是文件夹
  116. string(9) "file2.txt" <-----这个是文件
  117. }
  118. -----------------------------------*/
  119. /*---------好,咱们先看看程序第一次循环是怎么执行的。----------------*/
  120. //这里我们把循环代码执行的过程按while循环执行的顺序单拿出来模拟执行。
  121. $filename=readdir($res);//while($filename=readdir($res))这里执行并赋值给$filename,进行判断真假
  122. $newpath=$path.'\\dd\\dream2\\'.$filename;
  123. //根据以上判断,readdir($res)现在应该指向 dream3 这个文件夹
  124. //所以$newpath='D:\AppServ\www\php\720\dd\dream2\dream3'
  125. //if(is_dir($newpath)) 这里判断该路径是目录,执行真区间语句
  126. //$count+=blldir($newpath); <------执行这个语句
  127. /*-----做好准备,我带你进入盗梦空间,看你回得来回不来,我们要进入梦的第三层,觉醒------*/
  128. /* blldir($newpath);<---上面在累加语句中调用了函数本身,所以,函数的开始,就是我们进入梦的第三层的入口。请别忘了带着你来时候的陀螺,否则你会迷失,这个陀螺就是,$newpath,也就是你来时候的路径。$newpath='D:\AppServ\www\php\720\dd\dream2\dream3';---------*/
  129. /***********************************************************************************************
  130. 第三层梦开始了,我们执行该执行的任务
  131. ***********************************************************************************************/
  132. $res=opendir($newpath); //opendir打开资源,并赋给$res
  133. readdir($res); //读取这个资源,返回目录和文件的名称。
  134. readdir($res); //两次readdir读取当前目录. 和..上级目录,让指针指到..位置
  135. //------------到这里开始进入循环//while($filename=readdir($res))-----------------//
  136. /*执行while条件判断,如果返回名称则条件为真执行循环,否则返回faslse,停止循环
  137. ----------------------------------
  138. while($filename=readdir($res)){ 这里我们把循环结构改一下,看看到底$filename被赋予神马 东西了
  139. var_dump($filename); 用var_dump函数来查看$filename到底被赋予了哪些值,看见没
  140. echo '
    ';
  141. string(9) "file3.txt" <----这个是文件
  142. }
  143. -----------------------------------*/
  144. /*---------好,咱们先看看程序第一次循环是怎么执行的。----------------*/
  145. //这里我们把循环代码执行的过程按while循环执行的顺序单拿出来模拟执行。
  146. $filename=readdir($res);//while($filename=readdir($res))这里执行并赋值给$filename,进行判断真假
  147. $newpath=$path.'\\dd\\dream2\\dream3\\'.$filename;
  148. //根据以上判断,readdir($res)现在应该指向 file3.txt 这个文件
  149. //所以$newpath='D:\AppServ\www\php\720\dd\dream2\dream3\file3.txt';
  150. /*if(is_dir($newpath)) 这里判断该路径是不是一个目录,因为,file3.txt是一个文件,不是目录,所以执行else后面的语句。我们单拿出来执行。*/
  151. $count3+=filesize($newpath);//这条语句的功能是把文件的大小进行累加
  152. // return $count3; //这条语句把dream3(梦境3层的)里的所有文件累加之和返回给第二层
  153. /*------程序执行到这里,已经到了梦的最底层,最底层没有梦境了(目录),不要太贪婪,不然你真的回不去了,现在我带着你,我们一级一级的返回上层的梦境(目录),在返回的途中,你可别忘了,在每层梦境中,你还有暂未执行的任务,第一个任务:else后面的 $count+=filesize($newpath);累加那层梦境所有的文件大小之和 ;第二个任务:return $count; 把累加的结果返回给它所在层上一层调用函数自身的地方 ,也就是相当于这个样子 (如果抛弃语法概念),可以这么写。
  154. $count+=blldir($newpath); ---变形---> $count+=(return $count);
  155. 在这里我把return $count;这条语句比作孙悟空借用什么婆婆的那个大口袋,很能装。我们每下一层梦境,他就把那层所有的文件大小的累加总和都装到口袋里,返回给上一层入口,调用函数本身的地方。
  156. --> 现在我要谈谈这个大口袋$count,无论你if(is_dir($newpath))判断执行的是真还是假区间,因为真假区间里面都是$count(孙悟空的大口袋),而且每进入下一层$count的值都自动清零,那么从下层返回的$count值都是那层文件累加的总和,下层的返回值返回到本层的函数调用自身的地方,$count+=blldir()。遍历本层文件得到的累加$count值 ,与下层返回的$count值的和,就是本层和下层所有文件大小的总和。清楚这个概念以后,我们开始带着未执行的任务一级一级返回上层梦境。
  157. /********************************************************************************************
  158. dream3 --------> dream2 梦境三层返回到梦境二层
  159. ******************************************************************************************/
  160. //我们把$count 累加的结果先用搜集到的文件表示,会使道理更清晰,
  161. //dream3 中----->$count(file3.txt)---->返回给dream2层
  162. //dream2 中----->$count(file2.txt+file3.txt)------>返回给dd层
  163. //dd 中----->$count(file1.php+file2.txt+file3.txt) 返回给现实生活 ,第一次函数调用本身
  164. /*720 中----- if判断遇到下面文件会执行else后面语句进行累加文件大小。
  165. "file.php"
  166. "filefunc.php"
  167. "opdir.php"
  168. "jc.php"
  169. "jsq.html"
  170. "jsq.php"
  171. "include.php"
  172. "del.php"
  173. "read.php"
  174. "displayfiles.html"
  175. "demo.php"
  176. "demo.php.bak"
  177. "demosource.php"
  178. "demosource.php.bak"
  179. "var_dump.php"
  180. "var_dump.php.bak"
  181. 实际上$count 就包含上面所有文件大小的总和。*/
  182. /*那么有人想问,我们到第三层了,$count的值现在到底是多少?,这个问题很简单,就看你执行任务时遍历到了哪些文件,例如在dd中(第一层梦境),我们遍历到了 "file1.php" 这个文件,还有“dream2" 这个文件夹$count的值是file1.php文件大小值;在dream2中(第二层梦境)我们首先遍历到了 "dream3" 这个文件夹。因为程序首先看到的是dream3这个文件夹,根据if()语句,进入dream3(第三层),而dream2中累加file2.txt这个文件大小的语句因函数调用自身暂未被执行,所以,这时在dream2层中,$count值为0,这些语句就是在咱们返回到这层的时候,要执行的任务。
  183. */
  184. /*根据上述原理,我们下到每层的时候,我们遍历累加的文件有,如下所示:
  185. ----------------------------------------------------------------------------------------
  186. $newpath='D:\AppServ\www\php\720\'; "file.php"
  187. "filefunc.php"
  188. "opdir.php"
  189. "dd"<-----文件夹 --去dd层-->
  190. -----》$count0=( "file.php" +"filefunc.php" + "opdir.php" 三个文件大小之和)
  191. -----------------------------------------------------------------------------------------
  192. 1层 $newpath='D:\AppServ\www\php\720\dd'; "file1.php"
  193. "dream2" <---文件夹 -去dream2层-->
  194. -----》$count1=("file1.php" 一个文件大小)
  195. ------------------------------------------------------------------------------------------
  196. 2层 $newpath='D:\AppServ\www\php\720\dd\dream2'; "dream3" <----文件夹 -去dream3层-->
  197. "file2.txt" <---在文件夹后暂不统计
  198. 返回上层的时候再统计。
  199. -----》$count2=0;
  200. ------------------------------------------------------------------------------------------
  201. 3层 $newpath='D:\AppServ\www\php\720\dd\dream2\dream3'; "file3.txt"
  202. -----》$count3=("file3.txt" 一个文件大小)
  203. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  204. 统计遍历文件:现实 "file.php" , "filefunc.php", "opdir.php"
  205. 一层 "file1.php"
  206. 二层
  207. 三层 "file3.txt"
  208. --------------------------------------------------------------------
  209. 统计未执行任务:三层 无
  210. 二层 else 后累加语句 和 return $conut ;
  211. 一层 else 后累加语句 和 return $conut ;
  212. 现实 else 后累加语句 和 return $conut ;
  213. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  214. /*相信到这里,大家已经非常清晰我们返回去要做的事,就是把未执行的任务完成了。
  215. dream3层中,执行$count+=filesize($newpath); 然后执行return $count;把$count返回
  216. 到第二层中的调用函数本身处。*/
  217. /**************************返回到第二层****************************************
  218. dream2 梦的回归
  219. ********************************************************************************/
  220. // 二层未执行任务 else 后累加语句 和 return $conut;
  221. // 在二层if(is_dir($newpath))判断是目录后未执行到的情况。现在执行。
  222. $newpath='D:\AppServ\www\php\720\dd\dream2\file2.txt';//这个文件没被遍历。
  223. // 把三层的累加值返回到二层的调用处。
  224. $count2+=$count3; // 这里的原型是 $count2+=blldir($dewpath);
  225. //由于$newpath='D:\AppServ\www\php\720\dd\dream3
  226. // 所以三层返回return $count3;
  227. //变形后 $count2+=$count3;
  228. $count2+=filesize($newpath); //然后把本层的所有文件的大小累加到$count2;
  229. // 本层只有一个文件file2.txt
  230. /**************************返回到第一层****************************************
  231. dd 梦的回归
  232. ********************************************************************************/
  233. // 一层未执行任务 else 后累加语句 和 return $conut;
  234. // 在一层if(is_dir($newpath))判断是目录后已经执行到的情况。
  235. $newpath='D:\AppServ\www\php\720\dd\dream2\file1.txt';//这个文件已经被遍历过。
  236. // 把二层的累加值返回到一层的调用处。
  237. $count1+=$count2; // 这里的原型是 $count1+=blldir($dewpath);
  238. //由于$newpath='D:\AppServ\www\php\720\dd\dream2
  239. // 所以二层返回return $count2;
  240. //变形后 $count1+=$count2;
  241. /*我们现在要做的就是再次用if(is_dir($newpath))判断在一层中还有没有其他文件
  242. 没有被遍历到,根据目录结构我们可知,除了file1.txt,没有其他文件。所以现在
  243. 唯一要做的事把一层的遍历累加的文件大小总和 $count1返回给调用处*/
  244. // $count1+=filesize($newpath); //如果本层还有其他文件没有遍历到得话执行此语句
  245. // 本层只有一个文件file1.txt在下到一层的梦境时
  246. //候已经被累加过,所以这里就不执行此语句,除非
  247. //本层还有没被遍历到的文件。
  248. /**************************返回到现实生活****************************************
  249. 把第一层累加的值用 return 返回。(720目录)
  250. ********************************************************************************/
  251. // 现实(720目录)中未执行任务 else 后累加语句 和 return $conut ;
  252. // 在现实中if(is_dir($newpath))判断是目录后未执行到的情况。现在执行。
  253. /******************在现实(720)中,有下面这些文件未被遍历过**************************
  254. (**文件列表**)
  255. $newpath='D:\AppServ\www\php\720\jc.php';
  256. $newpath='D:\AppServ\www\php\720\jsq.html';
  257. $newpath='D:\AppServ\www\php\720\jsq.php';
  258. $newpath='D:\AppServ\www\php\720\include.php';
  259. $newpath='D:\AppServ\www\php\720\del.php';
  260. $newpath='D:\AppServ\www\php\720ead.php';
  261. $newpath='D:\AppServ\www\php\720\displayfiles.html';
  262. $newpath='D:\AppServ\www\php\720\demo.php';
  263. $newpath='D:\AppServ\www\php\720\demo.php.bak';
  264. $newpath='D:\AppServ\www\php\720\demosource.php';
  265. $newpath='D:\AppServ\www\php\720\demosource.php.bak';
  266. $newpath='D:\AppServ\www\php\720\var_dump.php';
  267. $newpath='D:\AppServ\www\php\720\var_dump.php.bak';
  268. **********************************************************************************************
  269. 我们先把一层return返回的$count1,累加到现实生活中已经遍历文件累加过的$count
  270. *********************************************************************************************/
  271. $count+=$count1;
  272. var_dump($count1);
  273. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  274. 好,三层到二层、二层到一层的所有文件大小之和我们已经累加完毕,再加上现实生活中在下一层梦境之前已经遍历的那几个文件,我们就剩下上述列表里的文件没有被遍历累加到$count .ok 开始。我们一个
  275. 一个把它们的文件大小值累加上。
  276. */
  277. $newpath='D:\AppServ\www\php\720\jc.php';
  278. $count+=filesize($newpath);
  279. $newpath='D:\AppServ\www\php\720\jsq.html';
  280. $count+=filesize($newpath);
  281. $newpath='D:\AppServ\www\php\720\jsq.php';
  282. $count+=filesize($newpath);
  283. $newpath='D:\AppServ\www\php\720\include.php';
  284. $count+=filesize($newpath);
  285. $newpath='D:\AppServ\www\php\720\del.php';
  286. $count+=filesize($newpath);
  287. $newpath='D:\AppServ\www\php\720ead.php';
  288. $count+=filesize($newpath);
  289. $newpath='D:\AppServ\www\php\720\displayfiles.html';
  290. $count+=filesize($newpath);
  291. $newpath='D:\AppServ\www\php\720\demo.php';
  292. $count+=filesize($newpath);
  293. $newpath='D:\AppServ\www\php\720\demo.php.bak';
  294. $count+=filesize($newpath);
  295. $newpath='D:\AppServ\www\php\720\demosource.php';
  296. $count+=filesize($newpath);
  297. $newpath='D:\AppServ\www\php\720\demosource.php.bak';
  298. $count+=filesize($newpath);
  299. $newpath='D:\AppServ\www\php\720\var_dump.php';
  300. $count+=filesize($newpath);
  301. $newpath='D:\AppServ\www\php\720\var_dump.php.bak';
  302. $count+=filesize($newpath);
  303. /* 大功告成了,我们完成了盗梦空间,从三层返回到现实生活。你有没有跟着我一起回来呢,找回自我!
  304. 相信你已经找到自我了吧。 其实上面的语句可以用一个while循环去执行,但是想让大家更了解程序执行
  305. 的过程,透过现象去看本质吧。ok,我们统计了720 这个文件夹的大小,$count值就是最终的整个720文件
  306. 夹大小值。在以后要查看文件夹大小的值,只需调用此递归函数即可,她会通过return返回给你结果的,她
  307. 很听话的。。。你还想和她一起盗梦空间吗?记住return,否则你就会陷入梦境,永远与她陪伴了!*/
  308. //由于文件夹里有.bak后缀的缓冲文件,所以在统计上有些误差。
  309. //感谢TBS小组的良明,在我陷入思维怪圈的时候,给了我一个全新的$count.
  310. //通过这个全新的$count ,我才从第三层梦境中返回,好险,差点没回来。
  311. echo $count;
  312. // by liuwei 2011年7月21日
  313. ?>

原文地址:

阅读(201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~