邪罗刹的菠萝阁


> 呵呵,小邪最近对操作文件比较感兴趣的说,所以咱们来把文件夹给遍历了,顺便生成个树。
> 我们要使用的函数有 Scandir,它的作用是列出指定路径中的文件和目录,就像 Dir 一样。

> 与更强力的 Glob() 函数,作用是以数组的形式返回与指定模式相匹配的文件名或目录。
> 友情提醒,千万别像小邪那样在电脑前面呆太长时间,否则就会像小邪一样得见鬼的高血糖。

一. 遍历单层文件夹:

> 在扫描单层文件夹的问题是,两个函数的结果虽有不同,不过表现是相差不大的。
> Scandir 函数会提供额外两行,分别是 “.” 和 “..” ,而 Glob 则是没有的。

function get_dir_scandir(){
	$tree = array();
	foreach(scandir('./') as $single){
		echo $single."<br/>\r\n";
	}
}
get_dir_scandir();
function get_dir_glob(){
	$tree = array();
	foreach(glob('./*') as $single){
		echo $single."<br/>\r\n";
	}
}
get_dir_glob();

二. 递归遍历文件树:

> 在递归扫描文件夹树的问题上,还是 Glob 函数的表现好一点,很准确的说。
> Scandir 函数会莫名其妙扫描两次 ../ 处的文件,也就是说如果小邪有俩文件。
> ../b.php 和 ../a.php,结果就会在扫描报告上面出现两次,很是奇怪。

//Update at 2010.07.25 - 以下代码作废
$path = '..';
function get_filetree_scandir($path){
	$tree = array();
	foreach(scandir($path) as $single){
		if(is_dir('../'.$single)){
			$tree = array_merge($tree,get_filetree($single));
		}
		else{
			$tree[] = '../'.$single;
		}
	}
	return $tree;
}
print_r(get_filetree_scandir($path));
//Update at 2010.07.25 - 以下为新代码
$path = './';
function get_filetree_scandir($path){
	$result = array();
	$temp = array();
	if (!is_dir($path)||!is_readable($path)) return null; //检测目录有效性
	$allfiles = scandir($path); //获取目录下所有文件与文件夹
	foreach ($allfiles as $filename) { //遍历一遍目录下的文件与文件夹
		if (in_array($filename,array('.','..'))) continue; //无视 . 与 ..
		$fullname = $path.'/'.$filename; //得到完整文件路径
		if (is_dir($fullname)) { //是目录的话继续递归
			$result[$filename] = get_filetree_scandir($fullname); //递归开始
		}
		else {
			$temp[] = $filename; //如果是文件,就存入数组
		}
	}
	foreach ($temp as $tmp) { //把临时数组的内容存入保存结果的数组
		$result[] = $tmp; //这样可以让文件夹排前面,文件在后面
	}
	return $result;
}
print_r(get_filetree_scandir($path));

> Glob 函数扫描灰常准确,并且会自动按照字母排好顺序,貌似是最佳方案。

$path = '..';
function get_filetree($path){
	$tree = array();
	foreach(glob($path.'/*') as $single){
		if(is_dir($single)){
			$tree = array_merge($tree,get_filetree($single));
		}
		else{
			$tree[] = $single;
		}
	}
	return $tree;
}
print_r(get_filetree($path));

三. 附言:

> 嘻嘻,小邪这里开始不和谐了,欢迎来墙。今天服务器很是不稳定呐,不知道怎么回事。
> 据戈戈说貌似是线路不稳定,难道 G.fw 又开始乱搞了?!小邪是翻墙才写好文章的。

> 额,小邪今天去了下医院,无语,血糖指数竟然到正常人的三倍鸟,貌似快挂鸟,阿门。
> 所以上午去了做饭前检查,下午又去做了饭后检查,结果昨天就没来得及写一下文章。

Leave a comment
67 Comments.
  1. 江流 Internet Explorer Windows 坐沙发!#1

    我是意在抢沙发的

    @
  2. 江流 Internet Explorer Windows 坐板凳!#2

    小邪高血压 哈哈

    @
  3. 第三眼 Mozilla Firefox Windows 躺地板!#3

    这次胸小,不够放一个“邪”字的。哇咔咔,美国线路在抽风,我翻墙来看小邪。
    话说,我也只能通过翻墙更新我的博客了,杯具正在进行中

    @
    • @第三眼 , 被你发现了,胸太小,水印都打不上去,小邪只好干瞪眼 ~
      话说,美国线路突然抽风,不知道发生了什么诡异的事情 ~ ╮(=_-)╭

      @
  4. Auston Jary Google Chrome Windows 天花板!#4

    还要翻墙更新博客???
    同一IP的我貌似没什么问题啊 :idea:

    @
  5. 万戈 Mozilla Firefox Windows 下水道!#5

    如果坐在电脑前的时间和血糖成正比,那我的血糖指数绝对比小邪的高!!!
    PS,还是没看懂关于PHP的那些,太囧了

    @
    • @万戈 , 呵呵,万兄要注意身体,小邪最近也要注意作息时间鸟 ~
      没事,呵呵,万兄的潜力无限,相信小邪淫荡的眼光 ~

      @
  6. Dropbox我上次外链了四首歌,几天后就放不了...

    @
  7. 丫是对啥都感兴趣,而且一日一趣儿 :biggrin:

    @
  8. PHP的代码也是非常优雅啊!我更爱Python,递归遍历某个路径下的所有文件只要短短几句,这里把它打印出来。
    for root, dirs, files in os.walk(path):
    for file in files:
    filepath = os.path.join(root, file)
    print filepath
    优雅吧!

    @
    • @Kada,
      啊。没有缩进了。。。。

      @
      • @Kada , 嘎嘎,以后你在评论框贴代码也可以这个样子 ~
        《pre lang="python" line="1"》
        代码代码代码代码 ~
        《/pre》

        for root, dirs, files in os.walk(path):
        	for file in files:
        		filepath = os.path.join(root, file)
        		print filepath
        
        @
    • @Kada , 恩,有机会的话小邪一定要学这个的 ~
      因为谷歌Appengine免费的强大平台放在那里 ~
      看着 (¯﹃¯)口水 ~

      @
  9. dropbox貌似每月有流量限制的,得注意下!

    @
  10. 只为那YD的黑白图片~ :mrgreen:

    @
  11. 又是一篇我看不懂的

    @
  12. 俺是来学习的

    @
  13. :mad: 又是YD的图!

    @
  14. 咦,小邪也上19楼

    @
  15. 幸好懂点递归~不然都看不懂~~

    YD的图能看·~~

    @
  16. 前面的技术文章我看不懂。
    Dropbox是个不错的东西,但是当年我用的时候给wpg论坛造成了不太好的影响,貌似被chrome报危险网站了,顿时我囧了很久呢~
    现在都不怎么用了~

    @
  17. 还是用你的空间作图床吧,安心,我一开始没在意,用flickr,后悔鸟。。

    @
  18. 已然变成一不和谐之物 呵呵

    @
  19. 高血糖?
    难道小邪很胖? :mrgreen:

    @
  20. 额. 貌似我没翻墙额

    @
  21. 血糖高了啊,要注意身体,身体是革命的本钱~

    @
  22. 咱俩是病了,我也病了好几天了,不过我没大碍。 :mad:

    @
  23. 看来你的PHP很历害,要向你学习.

    @
  24. 嗯,还是看不懂。纯支持。。

    @
  25. 看完了这篇文章,我也学会了用不和谐的图片吸引眼球的说! :mrgreen:

    @
  26. 恩 可以想象你在DIY的时候是多么的热血沸腾~ :exclaim:

    @
  27. 身体是革命的本钱啊。。。

    @
  28. 小邪,八卦一下,你很胖吗?

    @
  29. 进来看小MM的咯

    @

Leave a Reply


[ Ctrl + Enter ]