在写上一篇博客的时候,需要用到目录树结构来展示我的文件结构,于是乎吃力不讨好的把所有文件夹和文件都手动的”遍历“了一边。后来我就想,这样太容易出错了,而且很费力气,于是就想着写个php脚本来遍历一个目录下面的文件及文件夹,并生成目录树,方便以后再有需要用到目录树结构的地方,直接运行就行了。目前脚本生成的目录树结构可以直接通过浏览器查看,也可以下载生成txt文件。
二、思路介绍
生成目录树的思路很简单,遍历当前文件夹下面的内容,碰到”.“和”..“直接跳过,碰到文件夹则递归调用,碰到文件则先保存到数组中,等当前文件夹遍历完之后吧数组中的文件拼接起来,这个操作就是生成目录树了,生成之后还有一步操作,显示或者下载目录树。书写的过程中还有一些细节问题,这个要等到开发的时候才会有。为了好理解,好扩展,我将本来一个函数可以完成的事放入一个类中,让遍历文件夹的思路更加清晰。
三、代码实现
思路有了,写起代码来就如鱼得水(这也是一般为什么厉害的人告诉我们他写代码的时候甚至有超过一般的时间在思考,而不是立马动手写代码),好了看看部分代码:
3.1 生成目录树
1 /** 2 * 生成目录树 3 */ 4 public function createTree($path, $level=0){ 5 $level = $level; 6 $this->tree .= str_repeat($this->options["padding"], $level) 7 .$this->options["dirpre"] 8 .$this->_basename($path) 9 .$this->options["newline"]; 10 $level++; 11 $dirHandle = opendir($path); 12 $files = array(); 13 while (false !== ($dir = readdir($dirHandle))) { 14 if($dir == "." || $dir == ".."){ 15 continue; 16 } 17 if(!$this->options["showHide"] && substr($dir, 0, 1) == "."){ 18 continue; 19 } 20 $dir = $path.DIRECTORY_SEPARATOR.$dir; 21 if(is_dir($dir)){ 22 $this->createTree($dir, $level); 23 } elseif (is_file($dir)){ 24 array_push($files, $dir); 25 } 26 } 27 closedir($dirHandle); 28 foreach ($files as $key => $value) { 29 $this->tree .= str_repeat($this->options["padding"], $level) 30 .$this->options["filepre"] 31 .$this->_basename($value) 32 .$this->options["newline"]; 33 } 34 return $this; 35 }