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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
PHP Zip压缩 在线对文件进行压缩的函数
May 26 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
PHP编程中的__clone()方法使用详解
Nov 27 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
谈谈php对接芝麻信用踩的坑
Dec 01 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
设定php简写功能的方法
Nov 28 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 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-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
js表单序列化判断空值的实例
2017/09/22 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
使用Python编写vim插件的简单示例
2015/04/17 Python
Python可变参数函数用法实例
2015/07/07 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
python 调用HBase的简单实例
2016/12/18 Python
python实现周期方波信号频谱图
2018/07/21 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
硕士生找工作求职信
2014/07/05 职场文书
贷款委托书怎么写
2014/08/02 职场文书
个人作风建设自查报告
2014/10/22 职场文书
公司股东出资证明书
2014/11/01 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
保安2014年终工作总结
2014/12/06 职场文书
2016年感恩节寄语
2015/12/07 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python