本文实例讲述了PHP递归实现文件夹的复制、删除、查看大小操作。分享给大家供大家参考,具体如下:
PHP虽然提供了 filesize、copy、unlink 等文件操作的函数,但是没有提供 dirsize、copydir、rmdirs 等文件夹操作的函数(rmdir也只能删除空目录)。所以只能手动编写这些函数,主要的技巧是通过递归将问题逐层分解,直到分解成可以直接解决的最小子问题。
查看文件夹大小
由于文件夹是没有大小的,平常所说的文件夹尺寸准确的说应该是文件夹中所有文件的总大小。所以只需要将文件夹逐层查找,统计每一层所包含的文件大小,最后将结果从最深的文件夹返回合并。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 文件夹大小 * @param $path * @return int */ function dirsize( $path ) { $size = 0; $handle = opendir( $path ); while (( $item = readdir( $handle )) !== false) { if ( $item == '.' || $item == '..' ) continue ; $_path = $path . '/' . $item ; if ( is_file ( $_path )) $size += filesize ( $_path ); if ( is_dir ( $_path )) $size += dirsize( $_path ); } closedir ( $handle ); return $size ; } |
复制文件夹
文件是可以复制的,文件夹是不能复制的(但可以创建),如果要达到复制文件夹的效果,就需要生成一个和原始文件夹相同目录结构的新文件夹,然后将文件按照原目录结构复制到新文件夹。按照递归的思想,不用一开始就生成完整的目录结构,只需要遍历当前目录,发现文件夹不存在再创建即可,然后再将文件复制到对应的文件夹。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 复制文件夹 * @param $source * @param $dest */ function copydir( $source , $dest ) { if (! file_exists ( $dest )) mkdir ( $dest ); $handle = opendir( $source ); while (( $item = readdir( $handle )) !== false) { if ( $item == '.' || $item == '..' ) continue ; $_source = $source . '/' . $item ; $_dest = $dest . '/' . $item ; if ( is_file ( $_source )) copy ( $_source , $_dest ); if ( is_dir ( $_source )) copydir( $_source , $_dest ); } closedir ( $handle ); } |
删除文件夹
rmdir 只能删除空文件夹,而 unlink 可以删除文件。于是删除文件夹的思路就有了,先通过 unlink 删除目录下的所有文件,再通过 rmdir 删除剩下的空文件夹。使用递归处理的逻辑是,找到当前目录下所有文件和文件夹,删除其中的所有文件,再遍历下一层目录删除所有文件……直至最后一层目录,此时整个文件夹已经没有文件了(但是文件夹还在),此时递归开始返回,每向上返回一层就删除这一层的所有空目录,当返回到最顶层的时候,递归就结束了,同时所有的文件和目录也都删除了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 删除文件夹 * @param $path * @return bool */ function rmdirs( $path ) { $handle = opendir( $path ); while (( $item = readdir( $handle )) !== false) { if ( $item == '.' || $item == '..' ) continue ; $_path = $path . '/' . $item ; if ( is_file ( $_path )) unlink( $_path ); if ( is_dir ( $_path )) rmdirs( $_path ); } closedir ( $handle ); return rmdir ( $path ); } |
剪切文件夹
rename 是 PHP Filesystem 函数中的一个特例,它既可以重命名文件,也可以重命名文件夹。如果你为重命名文件传入不同的路径,它又成了剪切函数,堪称文件函数中小而美的典范。
1
2
3
4
5
6
|
/** * @param $oldname 必需。规定要重命名的文件或目录。 * @param $newname 必需。规定文件或目录的新名称。 * @param $context 可选。规定文件句柄的环境。 */ rename( $oldname , $newname , $context ); |
希望本文所述对大家PHP程序设计有所帮助。
原文链接:http://www.cnblogs.com/woider/p/6100224.html