PHP递归实现文件夹的复制、删除、查看大小操作示例

发布时间 - 2026-01-11 02:44:58    点击率:

本文实例讲述了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文件操作总结》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数组(Array)操作技巧大全》及《php字符串(string)用法总结》

希望本文所述对大家PHP程序设计有所帮助。


# PHP  # 递归  # 文件夹  # 复制  # 删除  # 查看大小  # PHP文件及文件夹操作之创建、删除、移动、复制  # PHP创建/删除/复制文件夹、文件  # PHP实现递归复制整个文件夹的类实例  # php删除与复制文件夹及其文件夹下所有文件的实现代码  # PHP操作文件类的函数代码(文件和文件夹创建  # 移动和删除)  # 探讨PHP删除文件夹的三种方法  # PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用  # php定时删除文件夹下文件(清理缓存文件)  # php删除文件夹及其文件夹下所有文件的函数代码  # php使用递归与迭代实现快速排序示例  # PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法  # 遍历  # 重命名  # 程序设计  # 操作技巧  # 这一  # 如果你  # 成了  # 相关内容  # 目录下  # 还在  # 的说  # 句柄  # 只需  # 感兴趣  # 数据结构  # 给大家  # 也都  # 不存在  # 可以直接 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  如何在腾讯云服务器快速搭建个人网站?  Python自动化办公教程_ExcelWordPDF批量处理案例  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  JavaScript如何操作视频_媒体API怎么控制播放  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何快速打造个性化非模板自助建站?  Android使用GridView实现日历的简单功能  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  黑客如何利用漏洞与弱口令入侵网站服务器?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  零服务器AI建站解决方案:快速部署与云端平台低成本实践  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  免费视频制作网站,更新又快又好的免费电影网站?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何确认建站备案号应放置的具体位置?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  java获取注册ip实例  Laravel如何与Pusher实现实时通信?(WebSocket示例)  音乐网站服务器如何优化API响应速度?  三星网站视频制作教程下载,三星w23网页如何全屏?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  使用Dockerfile构建java web环境  如何快速配置高效服务器建站软件?  如何快速使用云服务器搭建个人网站?  怎样使用JSON进行数据交换_它有什么限制  黑客入侵网站服务器的常见手法有哪些?  5种Android数据存储方式汇总  南京网站制作费用,南京远驱官方网站?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  中国移动官方网站首页入口 中国移动官网网页登录  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  javascript中的try catch异常捕获机制用法分析  如何在阿里云ECS服务器部署织梦CMS网站?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  制作企业网站建设方案,怎样建设一个公司网站?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  深圳网站制作培训,深圳哪些招聘网站比较好?