2009-08-18 23 views
32

La fonction rmdir() échoue si le dossier contient des fichiers. Je peux boucle à travers tous les fichiers dans le répertoire avec quelque chose comme ceci:PHP: Manière la plus simple de supprimer un dossier (y compris son contenu)

foreach (scandir($dir) as $item) { 
    if ($item == '.' || $item == '..') continue; 
    unlink($dir.DIRECTORY_SEPARATOR.$item); 
} 
rmdir($dir); 

Est-il possible de supprimer juste à la fois?

Répondre

47

Eh bien, il y a toujours

system('/bin/rm -rf ' . escapeshellarg($dir)); 

le cas échéant.

+8

Mais cela ne fonctionnera pas sur le serveur de Windows. – Raza

+4

@KashifRaza: Droit. D'où "si disponible". – chaos

+0

Sous Windows, utilisez ceci: système ('rd/Q/S' '. $ Dir.' ''); – ddelrio1986

2

Selon la source this;

Économisez du temps, si vous voulez nettoyer un répertoire ou le supprimer et vous êtes sur Windows.

Cette utilisation:

chdir ($file_system_path); 
    exec ("del *.* /s /q"); 

Vous pouvez utiliser la syntaxe autre DEL, ou tout autre util shell. Vous devrez peut-être autoriser le service à interagir avec le bureau, car c'est mon paramètre actuel et je ne le change pas pour le tester.

Sinon, vous pouvez trouver une méthode alternative here.

+0

c'est une mauvaise idée d'avoir à dépendre de votre OS ... cela ne fonctionne que sur Windows et échouerait sur un système Unix par exemple ... – patrick

59

rrmdir() - récursive supprimer des répertoires:

function rrmdir($dir) { 
    foreach(glob($dir . '/*') as $file) { 
    if(is_dir($file)) rrmdir($file); else unlink($file); 
    } rmdir($dir); 
} 
+9

Je supprime une fois mon projet entier en utilisant une telle fonction, attention! – gskema

+2

@gskema, Votre commentaire m'a fait rire !!! Je ne peux qu'imaginer le moment "ohhhh shhiiiiittttt". J'espère que vous avez tout récupéré! – silversunhunter

+3

@silversunhunter En fait, je ne l'ai pas fait. Quand 'unlink' supprime quelque chose, ça veut dire ça. Bonne chose que c'était seulement un projet d'essai. Leçon du jour: utiliser un VCS distant – gskema

1

Essayez ceci:

 
exec('rm -rf '.$user_dir); 
+5

jamais! vous devez esape $ user_dir! s'il vous plaît ajouter escapeshellarg ($ user_dir) –

+0

Êtes-vous fou? – BadHorsie

+0

dangereux et pire: dépend de votre système d'exploitation ... cela échouerait sur un système Windows par exemple ... – patrick

3
function delete_files($dir) { 
    if (is_dir($dir)) { 
    $objects = scandir($dir); 
    foreach ($objects as $object) { 
     if ($object != "." && $object != "..") { 
     if (filetype($dir."/".$object) == "dir") 
      delete_files($dir."/".$object); 
     else unlink ($dir."/".$object); 
     } 
    } 
    reset($objects); 
    rmdir($dir); 
    } 
} 
1

Ce auj supprimer le répertoire et sous-répertoires et fichiers:

function DelDir($target) { 
    if(is_dir($target)) { 
     $files = glob($target . '*', GLOB_MARK); //GLOB_MARK adds a slash to directories returned 

     foreach($files as $file) 
     { 
      DelDir($file);  
     } 

     rmdir($target); 
    } elseif(is_file($target)) { 
     unlink($target); 
    } 
} 
0

Une fonction sûre et bien situé dans les commentaires php par lprent Il empêche la suppression accidentelle contenu des répertoires de liens symboliques situés dans le répertoire courant

public static function delTree($dir) { 
    $files = array_diff(scandir($dir), array('.','..')); 
    foreach ($files as $file) { 
     (is_dir("$dir/$file") && !is_link($dir)) ? delTree("$dir/$file") : unlink("$dir/$file"); 
    } 
    return rmdir($dir); 
    }