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
header()函数使用说明
Nov 23 PHP
php学习 字符串课件
Jun 15 PHP
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
php 执行系统命令的方法
Jul 07 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
apache和PHP如何整合在一起
Oct 12 PHP
Linux安装配置php环境的方法
Jan 14 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 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
信用卡效验程序
2006/10/09 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
python中selenium库的基本使用详解
2020/07/31 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Delphi软件工程师试题
2013/01/29 面试题
市场营销毕业生自荐信
2013/11/23 职场文书
绿化工程实施方案
2014/03/17 职场文书
应届大学生自荐书
2014/06/17 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
委托书格式要求
2015/01/28 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
Python实现自动玩连连看的脚本分享
2022/04/04 Python