如何在 PHP 中递归删除目录及其全部内容(文件 + 子目录)

phpserver side programmingprogramming更新于 2025/7/7 12:52:17

PHP:PHP(超文本预处理器)是一种广泛使用的开源服务器端脚本语言,专为 Web 开发而设计。它最初由 Rasmus Lerdorf 于 1994 年创建,现已发展成为全球数百万开发人员使用的强大语言。

PHP 主要用于开发动态网页和 Web 应用程序。它允许开发人员将 PHP 代码嵌入 HTML 中,从而可以轻松地将服务器端逻辑与表示层混合。PHP 脚本在服务器上执行,并将生成的 HTML 发送到客户端浏览器。

在 PHP 中有多种方法可以递归删除目录及其全部内容(文件和子目录)。以下是三种常用方法:

  • 递归使用 rmdir() 和 unlink() 函数

  • 使用 glob() 函数

  • 使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 类

递归使用 rmdir() 和 unlink() 函数

在 PHP 中使用 rmdir() 和 unlink() 函数递归删除目录及其所有内容(文件和子目录),

示例

<?php
function deleteDirectory($dirPath) {
   if (is_dir($dirPath)) {
      $files = scandir($dirPath);
      foreach ($files as $file) {
         if ($file !== '.' && $file !== '..') {
            $filePath = $dirPath . '/' . $file;
            if (is_dir($filePath)) {
               deleteDirectory($filePath);
            } else {
               unlink($filePath);
            }
         }
      }
      rmdir($dirPath);
   }
}
?>

代码解释

deleteDirectory() 函数已定义,其参数为目录路径。

它使用 is_dir($dirPath) 检查给定路径是否为目录。如果不是目录,则函数返回。

如果是目录,则使用 scandir($dirPath) 检索指定目录中的文件和目录列表。

它遍历每个文件和目录,排除特殊条目"."和".."

对于每个条目,它通过连接目录路径和文件名来构建完整的文件路径。

如果条目是子目录,则在该子目录上递归调用 deleteDirectory() 函数。

如果条目是文件,则使用 unlink($filePath) 删除该文件。

处理完所有文件和子目录后,调用 rmdir($dirPath) 删除空目录本身。

要使用此函数,只需使用要删除的目录路径调用它即可:

<?php
   $directoryPath = '/path/to/directory';
   deleteDirectory($directoryPath);
?>

确保您拥有删除指定路径内文件和目录的适当权限。

使用 glob() 函数

要在 PHP 中使用 glob() 函数递归删除目录及其所有内容(文件和子目录),

示例

<?php
function deleteDirectory($dirPath) {
   $files = glob($dirPath . '/*');
   foreach ($files as $file) {
      if (is_dir($file)) {
         deleteDirectory($file);
      } else {
         unlink($file);
      }
   }
   rmdir($dirPath);
}
?>

代码解释

deleteDirectory() 函数已定义,其以目录路径作为参数。

它使用 glob() 函数,其模式为 $dirPath 。 '/*' 检索指定目录中的文件和目录列表。

它会遍历从 glob() 获取的每个条目。

对于每个条目,它会使用 is_dir($file) 检查它是否为目录。

如果是目录,则会在该子目录上递归调用 deleteDirectory() 函数以删除其内容。

如果是文件,则会使用 unlink($file) 删除该文件。

处理完所有文件和子目录后,会调用 rmdir($dirPath) 删除空目录本身。

要使用此函数,只需使用要删除的目录路径调用它即可:

<?php
$directoryPath = '/path/to/directory';
deleteDirectory($directoryPath);
?>

请确保您拥有删除指定路径内文件和目录的适当权限。

使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 类

要在 PHP 中使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 类递归删除目录及其所有内容(文件和子目录),

示例

<?php
function deleteDirectory($dirPath) {
   $iterator = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator($dirPath, 
RecursiveDirectoryIterator::SKIP_DOTS),
      RecursiveIteratorIterator::CHILD_FIRST
   );
   foreach ($iterator as $file) {
      if ($file->isDir()) {
         rmdir($file->getPathname());
      } else {
         unlink($file->getPathname());
      }
   }
     rmdir($dirPath);
}

?>

代码解释

deleteDirectory() 函数已定义,其参数为目录路径。

该函数使用指定的目录路径创建一个 RecursiveDirectoryIterator 对象。RecursiveDirectoryIterator::SKIP_DOTS 标志用于从迭代中排除特殊条目"."和".."

该函数创建一个 RecursiveIteratorIterator 对象,以递归方式迭代文件和目录。 RecursiveIteratorIterator::CHILD_FIRST 标志用于确保子元素在父元素之前处理。

它使用 $ 迭代器上的 foreach 循环遍历每个文件和目录。

对于每个条目,它使用 $file->isDir() 检查它是否为目录。

如果是目录,则使用 rmdir($file->getPathname()) 删除该目录。

如果是文件,则使用 unlink($file->getPathname()) 删除该文件。

处理完所有文件和子目录后,调用 rmdir($dirPath) 删除空目录本身。

要使用此函数,只需使用目录路径调用它即可。您想要删除的文件:

<?php
    $directoryPath = '/path/to/directory';
    deleteDirectory($directoryPath);
?>

请确保您拥有删除指定路径下文件和目录的适当权限。

结论

这些方法提供了不同的途径来实现相同的结果。您可以根据自己的具体需求和编码偏好选择合适的方法。请务必妥善处理权限,以确保您拥有删除文件和目录所需的权限。


相关文章