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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
php MsSql server时遇到的中文编码问题
Jun 11 PHP
php array_search() 函数使用
Apr 13 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
php常见的魔术方法详解
Dec 25 PHP
php+mysqli批量查询多张表数据的方法
Jan 29 PHP
使用Thinkphp框架开发移动端接口
Aug 05 PHP
php检查页面是否被百度收录
Oct 28 PHP
php生成微信红包数组的方法
Sep 05 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 && 逻辑与运算符使用说明
2010/03/04 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
python实现apahce网站日志分析示例
2014/04/02 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python中url标签使用知识点总结
2020/01/16 Python
深入了解python列表(LIST)
2020/06/08 Python
pycharm实现猜数游戏
2020/12/07 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
现金会计岗位职责
2013/12/05 职场文书
新浪微博实习心得体会
2014/01/27 职场文书
父母寄语大全
2014/04/12 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
导游词之天津盘山
2019/11/01 职场文书
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server