2009-08-26 9 views
27

Je dois supprimer un dossier avec le contenu en utilisant PHP. rmdir() et unlink() supprime les dossiers vides, mais ne peut pas supprimer les dossiers contenant des contenus.Comment faire pour supprimer un dossier avec le contenu en utilisant PHP

+6

@@ Maerlyn: J'ai posté cette question le 26 août 2009. L'une double que vous avez mentionné a été publié le 28 juillet 2010 .. Je crois que vous savez quoi faire MAINTENANT ... Avant de faire quelque chose s'il vous plaît vérifier une fois. – Fero

Répondre

80

Cette fonction vous permet de supprimer un dossier (aussi longtemps qu'il est inscriptible) et il est des fichiers et des sous-répertoires.

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = array_diff(scandir($path), array('.', '..')); 

     foreach ($files as $file) 
     { 
      Delete(realpath($path) . '/' . $file); 
     } 

     return rmdir($path); 
    } 

    else if (is_file($path) === true) 
    { 
     return unlink($path); 
    } 

    return false; 
} 

ou sans récursivité en utilisant RecursiveDirectoryIterator:

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); 

     foreach ($files as $file) 
     { 
      if (in_array($file->getBasename(), array('.', '..')) !== true) 
      { 
       if ($file->isDir() === true) 
       { 
        rmdir($file->getPathName()); 
       } 

       else if (($file->isFile() === true) || ($file->isLink() === true)) 
       { 
        unlink($file->getPathname()); 
       } 
      } 
     } 

     return rmdir($path); 
    } 

    else if ((is_file($path) === true) || (is_link($path) === true)) 
    { 
     return unlink($path); 
    } 

    return false; 
} 
+2

Great method, man . J'utilisais la commande très simple: , mais malheureusement certains serveurs n'autorisent pas la commande système, donc la vôtre (j'ai choisi la première) est une substitution très bonne et simple. Merci frere. –

+1

Est-ce que cela fonctionne également pour les chemins relatifs? Supposons que le chemin complet soit "/ var/www/html/folder_and_files_to_delete /" et que le script de suppression soit placé dans "/var/www/html/delete_folders_and_files.php". Puis-je simplement prendre "folder_and_files_to_delete" comme chemin? – yoano

+0

Comme, meilleure réponse – mghhgm

3

Vous devez parcourir le contenu du dossier (y compris le contenu de tous les sous-dossiers) et les supprimer en premier.

Il y a un exemple: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

Soyez prudent avec lui !!!

+3

Si vous voulez voter pour une réponse, veuillez indiquer pourquoi. – Fenton

+3

Probablement quelqu'un ici essayant d'élever leur réponse au sommet. +1 pour compenser. – ryeguy

+0

Merci ryeguy et aux autres! – Fenton

0

Vous pouvez toujours tricher et faire shell_exec("rm -rf /path/to/folder");

+2

Sauf si vous êtes sur Windows :) –

+0

Non recommandé du tout pour la production. – Volomike

+2

@Volomike: Pourquoi? C'est presque certainement plus rapide qu'une solution PHP. – ryeguy

1

Vous devrez supprimer tous les fichiers de manière récursive. Il y a des fonctions par exemple abondance dans les commentaires de la page de manuel rmdir:

http://www.php.net/rmdir

+0

J'espère que rmdir supprimera seulement le dossier qui n'a pas de contenu. S'il contient du contenu, il ne supprimera pas le dossier. – Fero

+0

C'est exactement vrai Fero - rmdir ne supprimera pas un répertoire contenant du contenu, c'est pourquoi vous devez d'abord supprimer tout contenu si vous voulez vous débarrasser d'un répertoire (y compris le contenu de tout sous-répertoire) – Fenton

1

Il n'y a pas construire seule fonction en PHP qui permettrait cela, vous devez écrire votre propre rmdir et délier.

Un exemple (extrait d'un commentaire sur php.net docs):

<? 
// ensure $dir ends with a slash 
function delTree($dir) { 
    $files = glob($dir . '*', GLOB_MARK); 
    foreach($files as $file){ 
     if(substr($file, -1) == '/') 
      delTree($file); 
     else 
      unlink($file); 
    } 
    rmdir($dir); 
} 
?> 
+1

Qu'est-ce que GLOB_MARK? – Randell

+0

@Randell: GLOB_MARK - Ajoute une barre oblique à chaque répertoire renvoyé. –

3

Voici un script qui va faire exactement ce dont vous avez besoin:

/** 
* Recursively delete a directory 
* 
* @param string $dir Directory name 
* @param boolean $deleteRootToo Delete specified top-level directory as well 
*/ 
function unlinkRecursive($dir, $deleteRootToo) 
{ 
    if(!$dh = @opendir($dir)) 
    { 
     return; 
    } 
    while (false !== ($obj = readdir($dh))) 
    { 
     if($obj == '.' || $obj == '..') 
     { 
      continue; 
     } 

     if ([email protected]($dir . '/' . $obj)) 
     { 
      unlinkRecursive($dir.'/'.$obj, true); 
     } 
    } 

    closedir($dh); 

    if ($deleteRootToo) 
    { 
     @rmdir($dir); 
    } 

    return; 
} 

Je l'ai de php.net et il fonctionne .

-3

Peut-être une meilleure approche est d'utiliser rm (si vous êtes sous Linux). Il serait quelque chose comme ça ($root doit toujours être à votre TMP directory pour empêcher la suppression des fichiers vitaux!):

function remove($dir) { 

    $root = $_SERVER['DOCUMENT_ROOT'].'/tmp/'; 

    if (is_dir($root.$dir)) { 

     exec('rm -rf '.$root.$dir); 

    } 

} 
+4

remove ("/") ... fera tout heureux :) –

+3

Yikes. Les commandes Shell doivent être évitées. – Volomike

+1

SUPPRIMER DES FICHIERS COMME CELA DANS UNE APPLICATION WEB DOIT ÊTRE ÉVITÉ. DONNER DES CHEMINS RELATIFS PEUT SUPPRIMER UN FICHIER DANS LE SYSTÈME SI L'UTILISATEUR DE L'APP A L'AUTORISATION. – ArunaFromLK

Questions connexes