PHP实现遍历目录下的所有文件,统计目录大小

这里是搬家过来的原创文章,本文是两年前写的,有点旧了,但总算有个家。于是发到这里。

终于写完了文件管理程序,说不上什么心得,这得那得。在这个过程中,把使用到的一点东东拿出来献宝,算是一个交代,大家不要见笑哈..

php里使用的是 readdir($dir_handle) ,该函数一次仅读一个文件,返回文件名称。她首先从文件 ‘.’ 读起,然后再读 ‘..’ ,读完这两个之后就是’.'(当前)目录下的文件了。按名称升序顺次读取。这里需要使用循环语句才能把当前目录下的所有文件都遍历一遍。

/**
 *        本函数实现了目录大小的统计功能。参数$dir即目录路径名。
 */
function directory_traverse($dir){
	if(is_dir($dir)){
		if($dir_handle = opendir($dir)){
			while (false !== ($file_name = readdir($dir_handle)) ){
				$file_type = filetype($dir.'/'.$file_name);
				if($file_name=='.' or $file_name =='..'){
					continue;
				}else{
					if('dir' == $file_type){
						directory_traverse($dir.'/'.$file_name);
					}elseif('file' == $file_type){
						$file_size += filesize($dir.'/'.$file_name);
					}
				} // if
			}// while
		}// if
	}elseif(is_file($dir)){
		$size = filesize($dir);
	}

	return $file_size ;
}

遍历文件并非难点,难点在于如何统计目录大小。文件大小用函数 filesize($filename)即可搞定。由于PHP函数库里并没有统计目录大小的函数,所以统计目录大小时需要自行设计这样的函数。而要获取整 个目录(包括子目录)的大小,则需递归实现文件大小的计算。

而上面那个函数仅仅统计了一个目录下所有非目录文件的大小,要把目录大小也统计了需要写下文件夹遍历后的大小统计,然后加上文件大小,就是整个目录的大小了。改进后,程序如下:

function directory_traverse($dir){
	if(is_dir($dir)){
		if($dir_handle = opendir($dir)){
			while (false !== ($file_name = readdir($dir_handle)) ){
				$file_type = filetype($dir.'/'.$file_name);
				if($file_name=='.' or $file_name =='..'){
					continue;
				} else {
					if('dir' == $file_type){
						$dir_size +=directory_traverse($dir.'/'.$file_name);
					} elseif('file' == $file_type){
						$file_size += filesize($dir.'/'.$file_name);
					}
				} // if
			}// while
		}// if
	}elseif(is_file($dir)){
		$size = filesize($dir);
	}

	return $file_size+$dir_size ;
}

在递归时,需要注意的地方是 文件名的取法,注意分割线 ‘/’ ,对文件的操作要非常小心这个东东的使用,一不小心就有可能陷入困境。上面的函数只是简单的一个实现,要实现更复杂的功能,可以在这个基础上进行扩展,具体方法嘛,^_^ 自己琢磨咯……

虽然,目录大小也统计出来了,但是这个函数相当耗资源。不是说文件多,而是当文件夹级数较深的时候,其局限性就被夸张的放大了,甚至1分钟后才有计算结 果。所以在这里要向各位达人请教啊, 相信你还有更好的方法,贴出来吧,让我们都过把瘾。

About 寒江独钓雪

A man's freedom world!
This entry was posted in PHP开发. Bookmark the permalink.

留下评论

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>