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 相关文章推荐
拼音码表的生成
Oct 09 PHP
PHP默认安装产生系统漏洞
Oct 09 PHP
也谈php网站在线人数统计
Apr 09 PHP
php Undefined index的问题
Jun 01 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
php缓冲输出实例分析
Jan 05 PHP
php自动载入类用法实例分析
Jun 24 PHP
laravel学习教程之关联模型
Jul 30 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
mysqli扩展无法在PHP7下升级问题的解决
Sep 10 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
调整PHP的性能
2013/10/30 PHP
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
高级运动鞋:GREATS
2019/07/19 全球购物
P/Invoke是什么
2015/07/31 面试题
大学生通用个人自我评价
2014/04/27 职场文书
理财计划书
2014/08/14 职场文书
租车协议书
2015/01/27 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
离婚民事起诉状
2015/08/03 职场文书
2016春季运动会前导词
2015/11/25 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
Golang 链表的学习和使用
2022/04/19 Golang