Как рекурсивно удалить каталог и все его содержимое (файлы + вложенные каталоги) в PHP? - PullRequest
116 голосов
/ 26 июля 2010

Как удалить каталог и все его содержимое (файлы и подкаталоги) в PHP?

Ответы [ 20 ]

183 голосов
/ 26 июля 2010

Вы пробовали первую заметку на странице справочника rmdir?

 function rrmdir($dir) { 
   if (is_dir($dir)) { 
     $objects = scandir($dir); 
     foreach ($objects as $object) { 
       if ($object != "." && $object != "..") { 
         if (is_dir($dir."/".$object))
           rrmdir($dir."/".$object);
         else
           unlink($dir."/".$object); 
       } 
     }
     rmdir($dir); 
   } 
 }
106 голосов
/ 28 июля 2010

Опираясь на Комментарий разработчика Pixel , фрагмент с использованием SPL может выглядеть следующим образом:

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($files as $fileinfo) {
    $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
    $todo($fileinfo->getRealPath());
}

rmdir($dir);

Примечание: нет проверка исправностии использует флаг SKIP_DOTS, введенный в FilesystemIterator в PHP 5.3.0.Конечно, $todo может быть if / else.Важным моментом является то, что CHILD_FIRST используется для перебора дочерних элементов (файлов) перед их родительскими элементами (папками).

15 голосов
/ 17 сентября 2013

Удаляет все файлы и папки в пути.

function recurseRmdir($dir) {
  $files = array_diff(scandir($dir), array('.','..'));
  foreach ($files as $file) {
    (is_dir("$dir/$file")) ? recurseRmdir("$dir/$file") : unlink("$dir/$file");
  }
  return rmdir($dir);
}
13 голосов
/ 26 июля 2010

Для * nix вы можете использовать shell_exec для rm -R или DEL /S folder_name для Windows.

5 голосов
/ 22 апреля 2015
<?php

use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use SplFileInfo;

# http://stackoverflow.com/a/3352564/283851
# https://gist.github.com/XzaR90/48c6b615be12fa765898

# Forked from https://gist.github.com/mindplay-dk/a4aad91f5a4f1283a5e2

/**
 * Recursively delete a directory and all of it's contents - e.g.the equivalent of `rm -r` on the command-line.
 * Consistent with `rmdir()` and `unlink()`, an E_WARNING level error will be generated on failure.
 *
 * @param string $source absolute path to directory or file to delete.
 * @param bool   $removeOnlyChildren set to true will only remove content inside directory.
 *
 * @return bool true on success; false on failure
 */
function rrmdir($source, $removeOnlyChildren = false)
{
    if(empty($source) || file_exists($source) === false)
    {
        return false;
    }

    if(is_file($source) || is_link($source))
    {
        return unlink($source);
    }

    $files = new RecursiveIteratorIterator
    (
        new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );

    //$fileinfo as SplFileInfo
    foreach($files as $fileinfo)
    {
        if($fileinfo->isDir())
        {
            if(rrmdir($fileinfo->getRealPath()) === false)
            {
                return false;
            }
        }
        else
        {
            if(unlink($fileinfo->getRealPath()) === false)
            {
                return false;
            }
        }
    }

    if($removeOnlyChildren === false)
    {
        return rmdir($source);
    }

    return true;
}
5 голосов
/ 05 января 2014

Здесь есть еще один поток с большим количеством примеров: Рекурсивная функция удаления каталогов для PHP?

Если вы используете Yii, вы можете оставить это в фреймворке:

CFileHelper::removeDirectory($my_directory);
1 голос
/ 15 октября 2015

Улучшенное решение @Artefacto - исправлены опечатки и упрощен код, работающий как для пустых, так и для непустых каталогов.

  function recursive_rmdir($dir) { 
    if( is_dir($dir) ) { 
      $objects = array_diff( scandir($dir), array('..', '.') );
      foreach ($objects as $object) { 
        $objectPath = $dir."/".$object;
        if( is_dir($objectPath) )
          recursive_rmdir($objectPath);
        else
          unlink($objectPath); 
      } 
      rmdir($dir); 
    } 
  }
1 голос
/ 09 сентября 2013

«простой» код, который работает и может быть прочитан десятилетним ребенком:

function deleteNonEmptyDir($dir) 
{
   if (is_dir($dir)) 
   {
        $objects = scandir($dir);

        foreach ($objects as $object) 
        {
            if ($object != "." && $object != "..") 
            {
                if (filetype($dir . "/" . $object) == "dir")
                {
                    deleteNonEmptyDir($dir . "/" . $object); 
                }
                else
                {
                    unlink($dir . "/" . $object);
                }
            }
        }

        reset($objects);
        rmdir($dir);
    }
}

Обратите внимание, что все, что я сделал, это расширил / упростил и исправил (не работал для непустого dir) решение здесь: В PHP как рекурсивно удалить все не пустые папки?

0 голосов
/ 23 января 2019

Кажется, что все остальные ответы предполагают, что путь к функции всегда является каталогом Этот вариант работает для удаления каталогов, а также отдельных файлов:

/**
 * Recursively delete a file or directory.  Use with care!
 *
 * @param string $path
 */
function recursiveRemove($path) {
    if (is_dir($path)) {
        foreach (scandir($path) as $entry) {
            if (!in_array($entry, ['.', '..'])) {
                recursiveRemove($path . DIRECTORY_SEPARATOR . $entry);
            }
        }
        rmdir($path);
    } else {
        unlink($path);
    }
}
0 голосов
/ 15 июня 2018

100% рабочий раствор

public static function rmdir_recursive($directory, $delete_parent = null)
  {
    $files = glob($directory . '/{,.}[!.,!..]*',GLOB_MARK|GLOB_BRACE);
    foreach ($files as $file) {
      if (is_dir($file)) {
        self::rmdir_recursive($file, 1);
      } else {
        unlink($file);
      }
    }
    if ($delete_parent) {
      rmdir($directory);
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...