2012-06-29 13 views
28

Ich dort eine Möglichkeit kann ich RegExp oder Wildcard-Suchvorgänge verwenden, um schnell alle Dateien in einem Ordner zu löschen, und entfernen Sie diesen Ordner in PHP, ohne die Verwendung der "exec " Befehl? Mein Server gibt mir keine Berechtigung, diesen Befehl zu verwenden. Eine einfache Schleife würde genügen.PHP: Verknüpfung aller Dateien in einem Verzeichnis und dann löschen dieses Verzeichnis

Ich brauche etwas, das die Logik hinter der folgenden Aussage erreichen würde, aber offensichtlich wäre, gilt:

 

$dir = "/home/dir" 
unlink($dir . "/*"); # "*" being a match for all strings 
rmdir($dir); 
 
+0

http://stackoverflow.com/questions/3349753/php-delete- machen Verzeichnis-mit-Dateien-in-es – John

+0

http://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-filessub-dirs – Jocelyn

Antwort

75

Verwenden glob alle Dateien zu finden, die ein Muster entsprechen.

function recursiveRemoveDirectory($directory) 
{ 
    foreach(glob("{$directory}/*") as $file) 
    { 
     if(is_dir($file)) { 
      recursiveRemoveDirectory($file); 
     } else { 
      unlink($file); 
     } 
    } 
    rmdir($directory); 
} 
+2

Ich habe ein Fehler 'Maximale Funktion Verschachtelungsebene von '100' erreicht ' – Smith

+0

Ich hatte Berechtigungsprobleme mit einer' scandir' Funktion in meinem Code, jetzt funktioniert es perfekt mit dieser Version! – SeinopSys

+1

Glob kümmert sich um versteckte Dateien? – amar

16

Verwenden glob() um durch das Verzeichnis leicht Loop-Dateien zu löschen, dann können Sie das Verzeichnis entfernen.

foreach (glob($dir."/*.*") as $filename) { 
    if (is_file($filename)) { 
     unlink($filename); 
    } 
} 
rmdir($dir); 
+12

Dieser Code ist gefährlich, Pfad sollte in der Glob wie '' glob ($ dir. "/ *. *") 'Enthalten sein.Ich habe es versucht und es löschte alle Verzeichnis einschließlich der besten meine harte Arbeit – Smith

1

Eine Möglichkeit, es zu tun wäre:

function unlinker($file) 
{ 
    unlink($file); 
} 
$files = glob('*.*'); 
array_walk($files,'unlinker'); 
rmdir($dir); 
9

Die glob() Funktion tut, was Sie suchen. Wenn Sie auf PHP sind 5.3+ könnten Sie so etwas tun:

$dir = ... 
array_walk(glob($dir . '/*'), function ($fn) { 
    if (is_file($fn)) 
     unlink($fn); 
}); 
unlink($dir); 
2

Sie die Symfony Filesystem component verwenden können, neu zu erfinden das Rad zu vermeiden, so dass Sie

use Symfony\Component\Filesystem\Filesystem; 

$filesystem = new Filesystem(); 

if ($filesystem->exists('/home/dir')) { 
    $filesystem->remove('/home/dir'); 
} 

tun können, wenn Sie es vorziehen, zu verwalten den Code selbst, hier ist die Symfony Code-Basis für die Verfahren zu

class MyFilesystem 
{ 
    private function toIterator($files) 
    { 
     if (!$files instanceof \Traversable) { 
      $files = new \ArrayObject(is_array($files) ? $files : array($files)); 
     } 

     return $files; 
    } 

    public function remove($files) 
    { 
     $files = iterator_to_array($this->toIterator($files)); 
     $files = array_reverse($files); 
     foreach ($files as $file) { 
      if (!file_exists($file) && !is_link($file)) { 
       continue; 
      } 

      if (is_dir($file) && !is_link($file)) { 
       $this->remove(new \FilesystemIterator($file)); 

       if (true !== @rmdir($file)) { 
        throw new \Exception(sprintf('Failed to remove directory "%s".', $file), 0, null, $file); 
       } 
      } else { 
       // https://bugs.php.net/bug.php?id=52176 
       if ('\\' === DIRECTORY_SEPARATOR && is_dir($file)) { 
        if (true !== @rmdir($file)) { 
         throw new \Exception(sprintf('Failed to remove file "%s".', $file), 0, null, $file); 
        } 
       } else { 
        if (true !== @unlink($file)) { 
         throw new \Exception(sprintf('Failed to remove file "%s".', $file), 0, null, $file); 
        } 
       } 
      } 
     } 
    } 

    public function exists($files) 
    { 
     foreach ($this->toIterator($files) as $file) { 
      if (!file_exists($file)) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 
6

Versuchen einfache Möglichkeit:

$dir = "/home/dir"; 
array_map('unlink', glob($dir."/*")); 
rmdir($dir); 

In Funktion für remove dir:

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('..', '.'))) { 
       unlinkr($file, $pattern); 
       //remove the directory itself 
       rmdir($file); 
       } else if(is_file($file) and ($file != __FILE__)) { 
       // make sure you don't delete the current script 
       unlink($file); 
      } 
     } 
     rmdir($dir); 
    } 

//call following way: 
unlinkr("/home/dir"); 
+2

Während dieses Code-Snippet die Frage lösen kann, [einschließlich einer Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely- Code-basierte Antworten) hilft wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. – Bono

4

Eine einfache und effektive Art und Weise der alle Dateien und Ordner rekursiv mit Standard PHP Library löschen, spezifisch, RecursiveIteratorIterator und RecursiveDirectoryIterator sein. Der Punkt ist in RecursiveIteratorIterator::CHILD_FIRST Flag, Iterator wird durch Dateien zuerst und Verzeichnis am Ende durchlaufen, so sobald das Verzeichnis leer ist, ist es sicher zu verwenden rmdir().

foreach(new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator('folder', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), 
    RecursiveIteratorIterator::CHILD_FIRST) as $value) { 
     $value->isFile() ? unlink($value) : rmdir($value); 
} 

rmdir('folder'); 
0

für alle Dateien zu entfernen können Sie das Verzeichnis entfernen und wieder .. mit einer einfachen Codezeile

<?php 
    $dir = '/home/files/'; 
    rmdir($dir); 
    mkdir($dir); 
?>