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往windows中添加用户
Dec 06 PHP
php自动获取目录下的模板的代码
Aug 08 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 PHP
LAMP环境使用Composer安装Laravel的方法
Mar 25 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 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
对javascript和select部件的结合运用
2006/10/09 PHP
怎样在php中使用PDF文档功能
2006/10/09 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
Python构造函数及解构函数介绍
2015/02/26 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
Python操作csv文件实例详解
2017/07/31 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python mock测试的示例
2020/10/19 Python
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
信息部岗位职责
2013/11/12 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
2015年市场部工作总结
2015/04/30 职场文书
会计主管竞聘书
2015/09/15 职场文书
新入职员工工作总结
2015/10/15 职场文书
辞职信怎么写?
2019/05/21 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库
python中validators库的使用方法详解
2022/09/23 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS