递归删除

2023-12-06

我有这段代码可以递归删除文件和目录。它工作正常,但有一个小问题。如果 $path = /var/www/foo/ 它将删除 foo 内部的所有内容,但不会删除 foo。我也想删除 foo 目录。任何想法?

public function delete($path) {
    if(!file_exists($path)) {
        throw new RecursiveDirectoryException('Directory doesn\'t exist.');
    }

    $directoryIterator = new DirectoryIterator($path);

    foreach($directoryIterator as $fileInfo) {
        $filePath = $fileInfo->getPathname();

        if(!$fileInfo->isDot()) {
            if($fileInfo->isFile()) {
                unlink($filePath);
            }
            else if($fileInfo->isDir()) {
                if($this->emptyDirectory($filePath)) {
                    rmdir($filePath);
                }
                else {
                    $this->delete($filePath);
                    rmdir($filePath);
                }
            }
        }
    }
}

为什么还要在你的函数中递归?

public function delete($path) {
    $it = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    foreach ($it as $file) {
        if (in_array($file->getBasename(), array('.', '..'))) {
            continue;
        } elseif ($file->isDir()) {
            rmdir($file->getPathname());
        } elseif ($file->isFile() || $file->isLink()) {
            unlink($file->getPathname());
        }
    }
    rmdir($path);
}

它有效,因为RII::CHILD_FIRST在父元素之前迭代子元素。因此,当它到达目录时,它应该是空的。

但实际的错误是由于您删除目录的位置造成的。在内部目录中,您可以在父迭代中执行此操作。这意味着您的根目录永远不会被删除。我建议在本地删除迭代中执行此操作:

public function delete($path) {
    if(!file_exists($path)) {
        throw new RecursiveDirectoryException('Directory doesn\'t exist.');
    }

    $directoryIterator = new DirectoryIterator($path);

    foreach($directoryIterator as $fileInfo) {
        $filePath = $fileInfo->getPathname();
        if(!$fileInfo->isDot()) {
            if($fileInfo->isFile()) {
                unlink($filePath);
            } elseif($fileInfo->isDir()) {
                if($this->emptyDirectory($filePath)) {
                    rmdir($filePath);
                } else {
                    $this->delete($filePath);
                }
            }
        }
    }
    rmdir($path);
}

请注意这两个变化。我们只删除迭代内的空目录。呼唤$this->delete()它将为您处理删除操作。第二个变化是增加了最后的rmdir在该方法的最后...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归删除 的相关文章

  • 使用 PHP 创建图表并导出为 PDF

    我正在寻找有关使用 PHP 创建图表的建议 我还希望能够将这些图表导出到 PDF 文档 我目前正在使用谷歌图表 但我不喜欢将我的所有信息发送到谷歌的想法 我更喜欢自己的托管解决方案 我见过很多 Flash 解决方案 但我不知道有什么方法可以
  • PHP 用星号替换所有字符

    假设我有一个字符串形式的密码 password thisisaplaintextpassword 我怎样才能把它变成下面的样子 password 我想通过电子邮件向用户发送他们的帐户详细信息 但不想发送整个内容 Use 字符串重复 http
  • 从 FilterControllerEvent 监听器重定向到另一个 Symfony 路由

    我正在尝试设置一个 kernel controller 侦听器 以便在函数返回 true 时重定向到另一个路由 我有可用的路线 但无法使用此路线设置控制器 event gt setController 我收到以下错误 FilterContr
  • Laravel 5.1 中的VerifyCsrfToken.php 第 53 行:(Firefox 浏览器)中出现 TokenMismatchException?

    我试图找出为什么会出现这个错误 即使它是全新安装的 我在我的项目中遇到了这个错误 所以我用谷歌搜索 没有一个答案对我有用 所以我创建了新项目并复制了所有控制器 视图和模型 几个小时后工作正常 再次出现令牌不匹配错误 为什么在 laravel
  • 如何在 Zend Framework 中存储 cron 作业的脚本?

    因为 ZF 的所有 URL 都依赖于 mod 重写 所以我并不清楚应该在哪里存储用于 cron 作业的本地脚本 有人有什么建议 或者有 正式接受 的方式吗 我用模块化目录结构 http framework zend com manual e
  • 覆盖供应商自动加载编辑器

    有没有办法让您创建的自动加载文件在调用供应商自动加载之前运行 我们似乎遇到了 SimpleSAML 的自动加载覆盖我们创建的自动加载文件之一的问题 我是 Composer 的新手 似乎无法在网上找到任何解决方案 我尝试将我们的自动加载文件包
  • 运行 Composer 返回:“无法打开输入文件:composer.phar”

    我是 symfony2 和阅读新手symblog http tutorial symblog co uk tutorial parts 在第三章中 在尝试使用数据装置时 我尝试了以下命令 php composer phar update 但
  • 如何将 PHPMailer 与 Codeigniter 3 集成

    嗨 我正在尝试使用PHPMailer 库 https github com PHPMailer PHPMailer来自我的 Codeigniter 应用程序中的 GitHub 我下载了代码并解压到我的application library文
  • 使用 php 更改白天和黑夜的背景?

    我正在制作一个 tumblr 页面 我的 html 页面有两种不同的背景 我希望白天背景从早上 7 点到晚上 8 点显示 夜间背景从晚上 8 点到早上 7 点显示 我决定用 php 来做这件事 但对于 php 来说我是个新手 我的朋友给我发
  • Node.js 中的 PHP exit()/die() 等价物是什么

    什么是 PHP die http www php net manual de function die php http www php net manual de function die php 在 Node js 中等效吗 https
  • 如何以编程方式获取 WooCommerce 中的所有产品?

    我想获取 WooCommerce 中的所有产品数据 产品 sku 名称 价格 库存数量 可用性等 我可以使用 wp query 来做到这一点吗 这样你就可以通过 wp query 获取所有产品 global wpdb all product
  • CakePHP Xml 实用程序库触发 DOMDocument 警告

    我正在使用 CakePHP 在视图中生成 XMLXML核心库 http book cakephp org 2 0 en core utility libraries xml html xml Xml build data array ret
  • PHP 中的 NOW() 函数

    是否有 PHP 函数以与 MySQL 函数相同的格式返回日期和时间NOW 我知道如何使用date 但我想问是否有专门用于此的功能 例如 返回 2009 12 01 00 00 00 您可以使用date https www php net m
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • php下拉菜单人口

    我正在尝试编写一个 php 脚本 该脚本将根据主下拉菜单的选择填充第二个下拉菜单 我想使用 jquery 来完成所有非页面刷新的事情 但我发现现有的所有东西都很难理解和修改 你知道有什么写得很好且易于理解的东西吗 或者可能是现有的教程 下面
  • 如何使用 Google 帐户对我们网站中的用户进行身份验证

    如何在我们的网站中使用 Google 帐户对用户进行身份验证 我希望用户重定向到谷歌登录页面 然后将他重定向到我的网站 我想要这个 PHP 实现 你要OAuth http code google com apis accounts docs
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐

  • 如何使用 FakeItEasy 更新参数的属性

    我有一个界面 其中包含一个如下所示的成员 void ExecuteSqlCommand string procedureName SqlParameter parameters 我正在使用 FakeItEasy 创建一个模拟 以传递给我的一
  • 为什么vb.net不支持多重继承?

    我见过一些关于为什么 c 不实现多重继承的讨论 但很少有人讨论为什么 vb 不支持多重继承 我知道 c 和 vb 都被编译为中间语言 因此它们都需要共享类似的限制 VB 中缺乏多重继承似乎被认为是 dot net 中缺乏该功能的原因之一 有
  • 对于 Power Query 中列中每个值第一次出现的情况,返回 1,否则返回 0

    我有一个数据列表 当每个值第一次出现时 我想在不同的列中返回 1 我可以在 Excel 表中使用公式 COUNTIF A 2 A2 A2 1 0 执行此操作 但我不知道如何在 Power Query 中执行此操作 可以在这里看到一个例子 U
  • 使用 WCF 通过线路传输最少的数据量

    我的项目有一个 netTCP WCF 服务 这是它的 app config
  • 使用 SqlAlchemy 将数据保存到数据库中,对象不可下标

    我正在尝试将一些数据插入数据库 不幸的是它失败并且没有保存 我怀疑我的数据结构不正确 在尝试保存 print title link date 之前 数据会在 process item 中很好地打印 每个对象 1 个标题 链接和日期 但无法保
  • Netbeans 默认使用逗号。为什么?

    大家好 女孩们 那么 Netbeans 像大多数 IDE 一样 使用点 来组织小数位 对吧 我不知道为什么 但我的 IDE 开始使用逗号 来组织小数位 甚至控制台中显示的输出也使用逗号 我如何将其更改回默认设置并再次开始在小数位上使用点 P
  • Android post 文件和文本

    我目前有两种方法 一种是发布文件 另一种是发布一些文本 它们如下 发布数据 public void postData Create a new HttpClient and Post Header ArrayList
  • preg_match(); - 未知修饰符“+”[重复]

    这个问题在这里已经有答案了 好的 我目前正在解析 RSS 提要 我已经获得了我需要的数据 没有问题 剩下的就是解析游戏标题 这是我目前拥有的代码 忽略马虎 它只是一个概念证明
  • Xamarin.iOS:Visual Studio 2019 更新后无法运行

    我面临着一个奇怪的情况 更新 Visual Studio 2019 后 我无法在 iOS 中运行该应用程序 当我尝试从链接到 Mac 的 Windows 计算机运行时会发生这种情况 但是 当我使用 Visual Studio for Mac
  • 如何找到字符串上正则表达式匹配的百分比? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我参与了一项数字无线电传播研究 其中远程发射器在定义的时间发送预定义的信标 该信标很容易与正则表达式匹配 但由于太阳和大气条件的原因 它并不总是 100 解码 我想做的是计算解码的百分
  • 在 Symfony 数据库中导入 Excel 数据

    我正在开发一个项目 需要将 Excel 数据导入到我的 Symfony 数据库中 但问题是我不知道该怎么做 我尝试使用 ExcelBundle 该项目是 用户必须使用表单按钮发送他的 Excel 文件 我需要提取不带标题的数据来填充我的数据
  • 连接到 Docker 容器中的 H2 数据库

    我有一个基本的 Spring Boot Data JPA 项目 我要连接的 h2 数据库位于 tmp customerdb h2 db 当使用运行应用程序时mvn spring boot run一切正常 应用程序连接到数据库 添加记录 并将
  • 如何在 Android 中使用带有“application/octet-stream”的 HTTP POST? (微软认知视频)

    我想在 Android 中使用视频认知服务 Microsoft提供的示例是在C 中使用的 视频功能正在向服务器发送 URL 所以我认为在Android中使用HTTP POST发送URL是可能的 http ppt cc V1piA 我遇到的问
  • 如何通过管道将一个 python 脚本的输出作为另一个 python 脚本的输入?

    例如 script1 py 从用户处获取中缀表达式并将其转换为后缀表达式并将其返回或打印到 stdout script2 py 从 stdin 获取后缀表达式并对其求值并输出值 我想做这样的事情 python3 script1 py pyt
  • 左/中/右对齐 LinearLayout - Android

    这应该很简单 但由于我是 Android 开发新手 所以我要问 我基本上想在我的 avtivity 底部创建一个带有简单按钮 上一个 主页 下一个 的静态菜单栏 但是我在调 整这些方面遇到了问题 因为机器人 layout alignPare
  • 在 SVG 或 WebGL 中使用 Canvas 进行 3D 应用

    我需要构建一个 html5 javascript 3d 应用程序 每个场景我都必须渲染大量对象 大约 200 300 个复杂对象或更多 而不会出现滞后 所以请告诉我应该选择哪种渲染技术 HTML5 Canvas SVG或 WebGL 我听说
  • 初学者了解循环冗余码算法

    at PNG 规范第 5 5 节 它在称为 CRC 或 循环冗余码 的 PNG 文件格式中讨论了这个概念 我以前从未听说过它 所以我正在尝试了解它 采用的 CRC 多项式是 x32 x26 x23 x22 x16 x12 x11 x10 x
  • 在运行时修改 Hikari 属性

    在哪里可以找到有关可在运行时修改的 Hikari 属性的信息 我尝试修改连接超时 我可以做到 并且会在HikariDataSource没有异常 通过设置然后获取属性进行检查 但没有任何效果 如果我最初这样做 HikariConfig con
  • React 路由在 facebook 的 create-react-app 构建中不起作用

    我正在使用反应路由器来定义路由 我正在使用创建反应应用程序为了发展 我的问题是 如果我在地址栏中输入子页面的 url 并尝试访问它 它在开发版本中有效 但在生产版本中无效 我正在使用一个简单的快速服务器来托管生产构建 var express
  • 递归删除

    我有这段代码可以递归删除文件和目录 它工作正常 但有一个小问题 如果 path var www foo 它将删除 foo 内部的所有内容 但不会删除 foo 我也想删除 foo 目录 任何想法 public function delete