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实现维护文件代码
Jun 14 PHP
PhpMyAdmin中无法导入sql文件的解决办法
Jan 08 PHP
PHP 字符串正则替换函数preg_replace使用说明
Jul 15 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
PHP+MYSQL会员系统的开发实例教程
Aug 23 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
php cli模式下获取参数的方法
May 05 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
php实现mysql封装类示例
2014/05/07 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHP加密技术的简单实现
2016/09/04 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
教你学会使用Python正则表达式
2017/09/07 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
益模软件Java笔试题
2012/03/27 面试题
高校辅导员推荐信范文
2013/12/25 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
诚实守信主题班会
2015/08/13 职场文书
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android