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同时支持GIF、png、JPEG
Oct 09 PHP
一贴学会PHP 新手入门教程
Aug 03 PHP
redis 队列操作的例子(php)
Apr 12 PHP
jQuery+php实现ajax文件即时上传的详解
Jun 17 PHP
PHP递归复制、移动目录的自定义函数分享
Nov 18 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
php微信开发之批量生成带参数的二维码
Jun 26 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
PHP7中I/O模型内核剖析详解
Apr 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
python读取oracle函数返回值
2016/07/18 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
简单说说tomcat的配置
2013/05/28 面试题
西柏坡观后感
2015/06/08 职场文书
创业计划书之家政服务
2019/09/18 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js