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 相关文章推荐
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
彻底杜绝PHP的session cookie错误
Aug 09 PHP
PHP的SQL注入过程分析
Jan 06 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
如何使用Strace调试工具
Jun 03 PHP
php session_start()出错原因分析及解决方法
Oct 28 PHP
php生成html文件方法总结
Dec 01 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP实现微信申请退款功能
Oct 01 PHP
php原生数据库分页的代码实例
Feb 18 PHP
laravel5.1框架model类查询的实现方法
Oct 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
mysql 性能的检查和优化方法
2009/06/21 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
php curl发送请求实例方法
2019/08/01 PHP
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
js实现随机抽奖
2020/03/19 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
python实现获取序列中最小的几个元素
2014/09/25 Python
python去除所有html标签的方法
2015/05/05 Python
python实现简单神经网络算法
2018/03/10 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
python看某个模块的版本方法
2018/10/16 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
python能自学吗
2020/06/18 Python
django rest framework 自定义返回方式
2020/07/12 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
国际经济贸易专业推荐信
2013/11/06 职场文书
房产买卖委托公证书
2014/04/04 职场文书
婚前财产协议书范本
2014/10/19 职场文书
嘉宾邀请函
2015/01/31 职场文书
市场部经理岗位职责
2015/02/02 职场文书
门卫岗位职责
2015/02/09 职场文书
2019公司管理制度
2019/04/19 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python