wake-up-neo.com

Eine rekursive Funktion zum Entfernen von Verzeichnissen für PHP?

Ich benutze PHP, um den Inhalt eines Bilder-Unterordners zu verschieben

GalleryName/images /

in einen anderen Ordner. Nach dem Umzug muss ich das GalleryName-Verzeichnis und alles andere darin löschen .

Ich weiß, dass rmdir() nur funktioniert, wenn das Verzeichnis leer ist. Ich habe eine Weile damit verbracht, eine rekursive Funktion für scandir() zu erstellen, beginnend von oben und dann unlink(), wenn es sich um eine Datei handelt, und scandir(), wenn es sich um ein Verzeichnis handelt, dann rmdir() für jedes leere Verzeichnis.

Bisher funktioniert es nicht genau richtig und ich fing an zu überlegen - ist das nicht eine lächerlich einfache Funktion, die PHP können sollte? Verzeichnis entfernen?

Also fehlt mir etwas? Oder gibt es zumindest eine bewährte Funktion, die die Leute für diese Aktion verwenden?

Jede Hilfe wäre dankbar.

PS Ich vertraue Ihnen allen hier mehr als den Kommentaren auf der php.net-Site - es gibt Hunderte von Funktionen dort, aber ich bin gespannt zu hören, ob einer von Ihnen hier einen anderen empfiehlt.

26
rhodesjason

Was ist mit dieser einen Ausgabe?

foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
        $path->isDir() && !$path->isLink() ? rmdir($path->getPathname()) : unlink($path->getPathname());
}
rmdir($dirPath);
84
barbushin

Dies ist die rekursive Funktion, die ich erstellt/modifiziert habe und die schließlich zu funktionieren scheint. Hoffentlich ist da nichts zu gefährlich.

function destroy_dir($dir) { 
    if (!is_dir($dir) || is_link($dir)) return unlink($dir); 
    foreach (scandir($dir) as $file) { 
        if ($file == '.' || $file == '..') continue; 
        if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) { 
            chmod($dir . DIRECTORY_SEPARATOR . $file, 0777); 
            if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) return false; 
        }; 
    } 
    return rmdir($dir); 
} 
14
rhodesjason

Wenn auf dem Anwendungsserver Linux ausgeführt wird, verwenden Sie einfach die Shell_exec () - Funktion und geben Sie den Befehl rm -R wie folgt ein:

Shell_exec("rm ".$dir_path." -R");

Erläuterung:

Die Funktion führt den eingefügten Befehl direkt in Linux aus. Es ist genau das Gleiche, dass der Befehl in Linux-Terminal ausgeführt wird.

Der Befehl rm entfernt eine Datei oder ein Verzeichnis, die in $dir_path übergeben wurden, und die Option -R teilt dem System mit Mit, es rekursiv auszuführen.

2
Gabriel Guelfi

Ich habe eine Funktion angepasst, die versteckte Unix-Dateien mit dem Punkt-Präfix behandelt und glob verwendet:

public static function deleteDir($path) {
    if (!is_dir($path)) {
        throw new InvalidArgumentException("$path is not a directory");
    }
    if (substr($path, strlen($path) - 1, 1) != '/') {
        $path .= '/';
    }
    $dotfiles = glob($path . '.*', GLOB_MARK);
    $files = glob($path . '*', GLOB_MARK);
    $files = array_merge($files, $dotfiles);
    foreach ($files as $file) {
        if (basename($file) == '.' || basename($file) == '..') {
            continue;
        } else if (is_dir($file)) {
            self::deleteDir($file);
        } else {
            unlink($file);
        }
    }
    rmdir($path);
}
0
Aram Kocharyan
public static function rrmdir($dir)
{
    if (is_dir($dir)) {
        $files = scandir($dir);
        foreach ($files as $file) {
            if ($file != "." && $file != "..") {
                if (filetype($dir . "/" . $file) == "dir")
                    self::rrmdir($dir . "/" . $file);
                else
                    unlink($dir . "/" . $file);
            }
        }
        reset($files);
        rmdir($dir);
    }
}
0
yousef

Es gibt einen anderen Thread mit weiteren Beispielen: Wie lösche ich rekursiv ein Verzeichnis und seinen gesamten Inhalt (Dateien + Unterverzeichnisse) in PHP?

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

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

Ich bevorzuge eine verbesserte Methode, die von den PHP-Hilfeseiten abgeleitet wurde http://php.net/manual/de/function.rmdir.php#115598

 // check accidential empty, root or relative pathes
 if (!empty($path) && ...)
 {
  if (PHP_OS === 'Windows')
  {
    exec('rd /s /q "'.$path.'"');
  }
  else
  {
      exec('rm -rf "'.$path.'"');
  }
}
else
{
    error_log('path not valid:$path'.var_export($path, true));
}

gründe für meine Entscheidung:

  • weniger Code
  • geschwindigkeit
  • halte es einfach
0
user1680948