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 相关文章推荐
VML绘图板②脚本--VMLgraph.js、XMLtool.js
Oct 09 PHP
PHP新手上路(二)
Oct 09 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 PHP
php中删除、清空session的方式总结
Oct 09 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
PHP 中常量的知识整理
Apr 14 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
详解php用static方法的原因
Sep 12 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
PHP ElasticSearch做搜索实例讲解
Feb 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分页显示制作详细讲解
2008/11/19 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
Python中文件操作简明介绍
2015/04/13 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
工程专业求职自荐书范文
2014/02/18 职场文书
火灾现场处置方案
2014/05/28 职场文书
企业口号大全
2014/06/12 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
观后感开头
2015/06/19 职场文书
2016年公司新年寄语
2015/08/17 职场文书
四年级数学教学反思
2016/02/16 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang
Python torch.flatten()函数案例详解
2021/08/30 Python