PHP递归实现文件夹的复制、删除、查看大小操作示例


Posted in PHP onAugust 11, 2017

本文实例讲述了PHP递归实现文件夹的复制、删除、查看大小操作。分享给大家供大家参考,具体如下:

PHP虽然提供了 filesize、copy、unlink 等文件操作的函数,但是没有提供 dirsize、copydir、rmdirs 等文件夹操作的函数(rmdir也只能删除空目录)。所以只能手动编写这些函数,主要的技巧是通过递归将问题逐层分解,直到分解成可以直接解决的最小子问题。

查看文件夹大小

由于文件夹是没有大小的,平常所说的文件夹尺寸准确的说应该是文件夹中所有文件的总大小。所以只需要将文件夹逐层查找,统计每一层所包含的文件大小,最后将结果从最深的文件夹返回合并。

/**
 * 文件夹大小
 * @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;
}

复制文件夹

文件是可以复制的,文件夹是不能复制的(但可以创建),如果要达到复制文件夹的效果,就需要生成一个和原始文件夹相同目录结构的新文件夹,然后将文件按照原目录结构复制到新文件夹。按照递归的思想,不用一开始就生成完整的目录结构,只需要遍历当前目录,发现文件夹不存在再创建即可,然后再将文件复制到对应的文件夹。

/**
 * 复制文件夹
 * @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 删除剩下的空文件夹。使用递归处理的逻辑是,找到当前目录下所有文件和文件夹,删除其中的所有文件,再遍历下一层目录删除所有文件……直至最后一层目录,此时整个文件夹已经没有文件了(但是文件夹还在),此时递归开始返回,每向上返回一层就删除这一层的所有空目录,当返回到最顶层的时候,递归就结束了,同时所有的文件和目录也都删除了。

/**
 * 删除文件夹
 * @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 函数中的一个特例,它既可以重命名文件,也可以重命名文件夹。如果你为重命名文件传入不同的路径,它又成了剪切函数,堪称文件函数中小而美的典范。

/**
 * @param $oldname 必需。规定要重命名的文件或目录。
 * @param $newname 必需。规定文件或目录的新名称。
 * @param $context 可选。规定文件句柄的环境。
 */
rename($oldname,$newname,$context);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php下实现折线图效果的代码
Apr 28 PHP
简单的PHP留言本实例代码
May 09 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
Aug 12 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
php 按指定元素值去除数组元素的实现方法
Nov 04 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
Yii实现显示静态页的方法
Apr 25 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
Mar 14 PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 #PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 #PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 #PHP
Redis在Laravel项目中的应用实例详解
Aug 11 #PHP
PHP验证码无法显示的原因及解决办法
Aug 11 #PHP
php readfile()修改文件上传大小设置
Aug 11 #PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 #PHP
You might like
PHP生成HTML静态页面实例代码
2008/08/31 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
pow在python中的含义及用法
2019/07/11 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
详细分析Python垃圾回收机制
2020/07/01 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
C#笔试题
2015/07/14 面试题
新驾驶员个人自我评价
2014/01/03 职场文书
运动会广播稿80字
2014/01/23 职场文书
小学教师寄语大全
2014/04/03 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android