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 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
php算开始时间到过期时间的相隔的天数
Jan 12 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
php数据库备份还原类分享
Mar 20 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
php实现复制移动文件的方法
Jul 29 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
CodeIgniter多语言实现方法详解
Jan 20 PHP
完美解决Thinkphp3.2中插入相同数据的问题
Aug 01 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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编程中的常见漏洞和代码实例
2014/08/06 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
深入理解Python中的内置常量
2017/05/20 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
浅析Python 多行匹配模式
2020/07/24 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
应届大学生求职的自我评价
2013/11/17 职场文书
关于期中考试的反思
2014/02/02 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
2014年城管工作总结
2014/11/20 职场文书
违纪学生保证书
2015/02/27 职场文书
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android