这里是搬家过来的原创文章,本文是两年前写的,有点旧了,但总算有个家。于是发到这里。
终于写完了文件管理程序,说不上什么心得,这得那得。在这个过程中,把使用到的一点东东拿出来献宝,算是一个交代,大家不要见笑哈..
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分钟后才有计算结 果。所以在这里要向各位达人请教啊, 相信你还有更好的方法,贴出来吧,让我们都过把瘾。