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的安全策略
Oct 09 PHP
新版PHP极大的增强功能和性能
Oct 09 PHP
PHP中cookies使用指南
Mar 16 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
PHP file_exists问题杂谈
May 07 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
Zend Framework数据库操作技巧总结
Feb 18 PHP
PHP convert_uudecode()函数讲解
Feb 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
PHP 选项及相关信息函数库
2006/12/04 PHP
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
php MessagePack介绍
2013/10/06 PHP
php多文件上传下载示例分享
2014/02/20 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
Python图算法实例分析
2016/08/13 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
师范应届生求职信
2013/11/15 职场文书
最新个人职业生涯规划书
2014/01/22 职场文书
买房协议书
2014/04/11 职场文书
文艺节目主持词
2015/07/06 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android