wake-up-neo.com

Wie lösche ich in PHP rekursiv ein Verzeichnis und seinen gesamten Inhalt (Dateien + Unterverzeichnisse)?

Wie lösche ich ein Verzeichnis und seinen gesamten Inhalt (Dateien und Unterverzeichnisse) in PHP?

111

Haben Sie den ersten Hinweis auf der Handbuchseite von rmdir ausprobiert?

 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); 
   } 
 }
175
Artefacto

Aufbauend auf Kommentar des Pixel-Entwicklers könnte ein Snippet, das die SPL verwendet, folgendermaßen aussehen:

$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);

Hinweis: Es wird eine no - Überprüfung der Integrität durchgeführt und das mit dem FilesystemIterator in PHP 5.3.0 eingeführte Flag SKIP_DOTS verwendet. Natürlich könnte der $todo eine if/else sein. Der wichtige Punkt ist, dass CHILD_FIRST verwendet wird, um die untergeordneten Dateien (Dateien) zuerst vor ihren übergeordneten Ordnern (Ordnern) zu durchlaufen.

103
salathe

Löscht alle Dateien und Ordner im Pfad.

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);
}
14
Liko

Für * nix können Sie einen Shell_exec für rm -R oder DEL /S folder_name für Windows verwenden.

13
ankitjaininfo
<?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
XzaR

Es gibt einen anderen Thread mit weiteren Beispielen: Eine rekursive Funktion zum Entfernen von Verzeichnissen für PHP?

Wenn Sie Yii verwenden, können Sie es dem Framework überlassen:

CFileHelper::removeDirectory($my_directory);
5
David Newcomb

"Einfacher" Code, der funktioniert und von einem Zehnjährigen gelesen werden kann:

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);
    }
}

Bitte beachten Sie, dass alles, was ich getan habe, erweitert/vereinfacht und korrigiert wurde (funktionierte nicht für nicht leeres Verzeichnis). Die Lösung hier: Wie entferne ich in PHP rekursiv alle Ordner, die nicht leer sind?

1
Programster

Verbesserte Lösung von @Artefacto - korrigierte Tippfehler und vereinfachter Code für beide - leere und nicht leere Verzeichnisse.

  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
jave.web

Es scheint, dass alle anderen Antworten davon ausgehen, dass der Pfad der Funktion immer ein Verzeichnis ist. Diese Variante kann sowohl Verzeichnisse als auch einzelne Dateien entfernen:

/**
 * 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
jlh

Etwas wie das?

function delete_folder($folder) {
    $glob = glob($folder);
    foreach ($glob as $g) {
        if (!is_dir($g)) {
            unlink($g);
        } else {
            delete_folder("$g/*");
            rmdir($g);
        }
    }
}
0
K-Gun

Beispiel mit glob () Funktion. Es werden alle Dateien und Ordner rekursiv gelöscht, einschließlich Dateien, die mit Punkt beginnen.

delete_all( 'folder' );

function delete_all( $item ) {
    if ( is_dir( $item ) ) {
        array_map( 'delete_all', array_diff( glob( "$item/{,.}*", GLOB_BRACE ), array( "$item/.", "$item/.." ) ) );
        rmdir( $item );
    } else {
        unlink( $item );
    }
};
0
Danijel

Die 100% ige Arbeitslösung

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);
    }
  }
0
David Pankov

Wenn Sie die Tests abgeschlossen haben, müssen Sie nur noch # entfernen aus der Klasse #unlink und #rmdir in der Klasse auswählen. 

<?php 
class RMRFiles {

        function __construct(){
        }

    public function recScan( $mainDir, $allData = array() )
    {

    // hide files
    $hidefiles = array(
    ".",
    "..") ;

    //start reading directory
    $dirContent = scandir( $mainDir ) ;

        //cycle through
        foreach ( $dirContent as $key => $content )
        {
            $path = $mainDir . '/' . $content ;

            // if is readable / file
            if ( ! in_array( $content, $hidefiles ) )
            {
            if ( is_file( $path ) && is_readable( $path ) )
            {
            #delete files within directory
            #unlink($path);
            $allData['unlink'][] = $path ;
            }

            // if is readable / directory
            else
            if ( is_dir( $path ) && is_readable( $path ) )
            {
            /*recursive*/
            $allData = $this->recScan( $path, $allData ) ;

            #finally remove directory
            $allData['rmdir'][]=$path;
            #rmdir($path);
            }
            }
        }

    return $allData ;

    }

}

header("Content-Type: text/plain");

/* Get absolute path of the running script 
Ex : /home/user/public_html/   */
define('ABPATH', dirname(__file__) . '/'); 

/* The folder where we store cache files 
Ex: /home/user/public_html/var/cache   */
define('STOREDIR','var/cache'); 

$rmrf = new RMRFiles();
#here we delete folder content files & directories
print_r($rmrf->recScan(ABPATH.STOREDIR));
#finally delete scanned directory ? 
#rmdir(ABPATH.STOREDIR);

?>
0
Alin Razvan

die unlinkr-Funktion löscht rekursiv alle Ordner und Dateien im angegebenen Pfad, indem sichergestellt wird, dass das Skript selbst nicht gelöscht wird.

function unlinkr($dir, $pattern = "*") {
    // find all files and folders matching pattern
    $files = glob($dir . "/$pattern"); 

    //interate thorugh the files and folders
    foreach($files as $file){ 
    //if it is a directory then re-call unlinkr function to delete files inside this directory     
        if (is_dir($file) and !in_array($file, array('..', '.')))  {
            echo "<p>opening directory $file </p>";
            unlinkr($file, $pattern);
            //remove the directory itself
            echo "<p> deleting directory $file </p>";
            rmdir($file);
        } else if(is_file($file) and ($file != __FILE__)) {
            // make sure you don't delete the current script
            echo "<p>deleting file $file </p>";
            unlink($file); 
        }
    }
}

wenn Sie alle Dateien und Ordner löschen möchten, in denen Sie dieses Skript ablegen, rufen Sie es wie folgt auf

//get current working directory
$dir = getcwd();
unlinkr($dir);

wenn Sie nur PHP-Dateien löschen möchten, rufen Sie es wie folgt auf

unlinkr($dir, "*.php");

sie können auch einen anderen Pfad verwenden, um die Dateien zu löschen 

unlinkr("/home/user/temp");

Dadurch werden alle Dateien im Verzeichnis home/user/temp gelöscht.

0
Tofeeq
<?php

/**
 * code by Nk ([email protected])
 */

class filesystem
{
    public static function remove($path)
    {
        return is_dir($path) ? rmdir($path) : unlink($path);
    }

    public static function normalizePath($path)
    {
        return $path.(is_dir($path) && !preg_match('@/[email protected]', $path) ? '/' : '');      
    }

    public static function rscandir($dir, $sort = SCANDIR_SORT_ASCENDING)
    {
        $results = array();

        if(!is_dir($dir))
        return $results;

        $dir = self::normalizePath($dir);

        $objects = scandir($dir, $sort);

        foreach($objects as $object)
        if($object != '.' && $object != '..')
        {
            if(is_dir($dir.$object))
            $results = array_merge($results, self::rscandir($dir.$object, $sort));
            else
            array_Push($results, $dir.$object);
        }

        array_Push($results, $dir);

        return $results;
    }

    public static function rrmdir($dir)
    {
        $files = self::rscandir($dir);

        foreach($files as $file)
        self::remove($file);

        return !file_exists($dir);
    }
}

?>

cleanup.php:

<?php

/* include.. */

filesystem::rrmdir('/var/log');
filesystem::rrmdir('./cache');

?>
0
Nkc