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连接MySQL代码的参数说明
Jun 07 PHP
php下mysql数据库操作类(改自discuz)
Jul 03 PHP
PHP页面间参数传递的四种方法详解
Jun 09 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 01 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 PHP
laravel-admin 实现给grid的列添加行数序号的方法
Oct 08 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 字符串操作入门教程
2006/12/06 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
javascript 对象的定义方法
2007/01/10 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
Python实现扩展内置类型的方法分析
2017/10/16 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
机关门卫制度
2014/02/01 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书