一、序言
在写上一篇博客的时候,需要用到目录树结构来展示我的文件结构,于是乎吃力不讨好的把所有文件夹和文件都手动的”遍历“了一边。后来我就想,这样太容易出错了,而且很费力气,于是就想着写个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 }
3.2 显示目录树
1 /** 2 * 显示目录树 3 */ 4 public function showTree(){ 5 echo "<pre>" 6 .$this->tree 7 ."</pre>"; 8 }
3.3 下载目录树
1 /** 2 * 下载目录树文件 3 */ 4 public function downloadTree($name){ 5 header("Content-type:text/plain"); 6 header("Content-Disposition:attachment;filename={$name}.txt"); 7 echo $this->tree; 8 }
3.4 试验下
用下面的两端代码分别测试下:
1 $t = new Dirtree(array("padding"=>" ","newline"=>"<br>")); 2 $t->createTree("D:autoload")->showTree("tree");
上面这段代码会将目录结构信息输出到浏览器,就像图1那样:
图 1 输出目录结构到浏览器 图 2 下载目录树结构
1 $t = new Dirtree(array("padding"=>" ","newline"=>" ")); 2 $t->createTree("D:autoload")->downloadTree("tree");
上面的代码执行后,浏览器会下载一个tree.txt文件,打开文件的信息如图2所示
四、 总结
一个生成目录树功能基本完成了,但是这个要是有时间的话还可以在扩展扩展,让他更友好的支持命令行模式。或者对输出的内容做做强化,让文件夹可以折叠(js实现)。
本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。