Supprimer un répertoire avec des fichiers?

je me demande, Quelle est la meilleure façon de supprimer un répertoire avec tous ses fichiers?

j'utilise rmdir(PATH . '/' . $value); pour supprimer un dossier, Cependant, s'il y a des fichiers à l'intérieur de celui-ci, je ne peux tout simplement pas le supprimer.

188
demandé sur Nick 2010-07-28 07:41:48

30 réponses

il y a au moins deux options disponibles aujourd'hui.

  1. avant de supprimer le dossier, supprimez tous ses fichiers et dossiers (et cela signifie la récursion!). Voici un exemple:

    public static function deleteDir($dirPath) {
        if (! is_dir($dirPath)) {
            throw new InvalidArgumentException("$dirPath must be a directory");
        }
        if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
            $dirPath .= '/';
        }
        $files = glob($dirPath . '*', GLOB_MARK);
        foreach ($files as $file) {
            if (is_dir($file)) {
                self::deleteDir($file);
            } else {
                unlink($file);
            }
        }
        rmdir($dirPath);
    }
    
  2. et si vous utilisez 5.2+ vous pouvez utiliser un Récursiveiterator pour le faire sans avoir besoin de faire la récursion vous-même:

    $dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree';
    $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
    $files = new RecursiveIteratorIterator($it,
                 RecursiveIteratorIterator::CHILD_FIRST);
    foreach($files as $file) {
        if ($file->isDir()){
            rmdir($file->getRealPath());
        } else {
            unlink($file->getRealPath());
        }
    }
    rmdir($dir);
    
296
répondu alcuadrado 2014-12-12 19:57:31

Je l'utilise généralement pour supprimer tous les fichiers dans un dossier:

array_map('unlink', glob("$dirname/*.*"));

Et ensuite vous pouvez faire

rmdir($dirname);
155
répondu user3033886 2014-10-17 11:24:55

Quelle est la meilleure façon de supprimer un répertoire avec tous ses fichiers?

system("rm -rf ".escapeshellarg($dir));
72
répondu Your Common Sense 2013-02-21 11:03:39

fonction courte qui fait le travail:

function deleteDir($path) {
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}

Je l'utilise dans une classe Utils comme celle-ci:

class Utils {
    public static function deleteDir($path) {
        $class_func = array(__CLASS__, __FUNCTION__);
        return is_file($path) ?
                @unlink($path) :
                array_map($class_func, glob($path.'/*')) == @rmdir($path);
    }
}

avec grand pouvoir vient grande responsabilité : lorsque vous appelez cette fonction avec une valeur vide, il supprimera les fichiers commençant en root ( / ). Comme une sauvegarde, vous pouvez vérifier si le chemin est vide:

function deleteDir($path) {
    if (empty($path)) { 
        return false;
    }
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
44
répondu Blaise 2014-11-26 10:23:42

C'est une Version plus courte fonctionne très bien pour moi

function deleteDirectory($dirPath) {
    if (is_dir($dirPath)) {
        $objects = scandir($dirPath);
        foreach ($objects as $object) {
            if ($object != "." && $object !="..") {
                if (filetype($dirPath . DIRECTORY_SEPARATOR . $object) == "dir") {
                    deleteDirectory($dirPath . DIRECTORY_SEPARATOR . $object);
                } else {
                    unlink($dirPath . DIRECTORY_SEPARATOR . $object);
                }
            }
        }
    reset($objects);
    rmdir($dirPath);
    }
}
18
répondu Playnox 2013-08-22 00:05:13

comme vu dans le commentaire le plus voté sur la page de manuel de PHP à propos de rmdir() (voir http://php.net/manual/es/function.rmdir.php ), glob() ne renvoie pas les fichiers cachés. La mention scandir() est fournie à titre de solution de rechange pour régler cette question.

algorithme décrit là (qui a fonctionné comme un charme dans mon cas) est:

<?php 
    function delTree($dir)
    { 
        $files = array_diff(scandir($dir), array('.', '..')); 

        foreach ($files as $file) { 
            (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        }

        return rmdir($dir); 
    } 
?>
12
répondu German Latorre 2015-03-10 10:30:14

ici vous avez une belle et simple récursion pour supprimer tous les fichiers dans le répertoire source y compris ce répertoire:

function delete_dir($src) { 
    $dir = opendir($src);
    while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' )) { 
            if ( is_dir($src . '/' . $file) ) { 
                delete_dir($src . '/' . $file); 
            } 
            else { 
                unlink($src . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
    rmdir($src);

}
La fonction

est basée sur la récursion faite pour copier le répertoire. Vous pouvez trouver cette fonction ici: copier le contenu entier d'un répertoire vers un autre en utilisant php

7
répondu Tommz 2017-05-23 12:26:38

vous pouvez utiliser le de Symfony ( code ):

// composer require symfony/filesystem

use Symfony\Component\Filesystem\Filesystem;

(new Filesystem)->remove($dir);

cependant je ne pouvais pas supprimer certaines structures de répertoires Complexes avec cette méthode, donc d'abord vous devriez l'essayer pour vous assurer qu'il fonctionne correctement.



Je pourrais supprimer ladite structure de répertoire en utilisant une implémentation spécifique à Windows:

$dir = strtr($dir, '/', '\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');



Et juste pour être complet, voici un vieux code:

function xrmdir($dir) {
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }
        $path = $dir.'/'.$item;
        if (is_dir($path)) {
            xrmdir($path);
        } else {
            unlink($path);
        }
    }
    rmdir($dir);
}
7
répondu Gras Double 2017-07-13 22:10:19

je préfère ceci parce qu'il retourne toujours TRUE quand il réussit et FALSE quand il échoue, et il empêche aussi un bug où un chemin vide pourrait essayer de tout Supprimer de '/*' !!:

function deleteDir($path)
{
    return !empty($path) && is_file($path) ?
        @unlink($path) :
        (array_reduce(glob($path.'/*'), function ($r, $i) { return $r && deleteDir($i); }, TRUE)) && @rmdir($path);
}
3
répondu Matt Connolly 2012-07-26 02:26:49

Qu'à ce sujet:

function recursiveDelete($dirPath, $deleteParent = true){
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
        $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
    }
    if($deleteParent) rmdir($dirPath);
}
3
répondu adrian 2015-10-13 10:34:15

la fonction Glob ne renvoie pas les fichiers cachés, donc scandir peut être plus utile, quand on essaie de supprimer récursivement un arbre.

<?php
public static function delTree($dir) {
   $files = array_diff(scandir($dir), array('.','..'));
    foreach ($files as $file) {
      (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
    }
    return rmdir($dir);
  }
?>
3
répondu candlejack 2017-01-04 17:54:53

Litle peu modifier de alcuadrado du code de 151910920" ne pas voir les fichiers avec le nom de points comme .htaccess donc j'utilise scandir et le script supprime lui-même - cochez la case __FILE__ .

function deleteDir($dirPath) {
    if (!is_dir($dirPath)) {
        throw new InvalidArgumentException("$dirPath must be a directory");
    }
    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }
    $files = scandir($dirPath); 
    foreach ($files as $file) {
        if ($file === '.' || $file === '..') continue;
        if (is_dir($dirPath.$file)) {
            deleteDir($dirPath.$file);
        } else {
            if ($dirPath.$file !== __FILE__) {
                unlink($dirPath.$file);
            }
        }
    }
    rmdir($dirPath);
}
2
répondu karma_police 2013-12-30 22:51:20

la meilleure Solution pour moi

my_folder_delete("../path/folder");

code:

function my_folder_delete($path) {
    if(!empty($path) && is_dir($path) ){
        $dir  = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs are not included,otherwise DISASTER HAPPENS :)
        $files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($files as $f) {if (is_file($f)) {unlink($f);} else {$empty_dirs[] = $f;} } if (!empty($empty_dirs)) {foreach ($empty_dirs as $eachDir) {rmdir($eachDir);}} rmdir($path);
    }
}

p. S. Souviens-toi!

dont passer des valeurs vides à n'importe quel répertoire effaçant des fonctions!!! (sauvegarde toujours, sinon un jour vous pourriez obtenir la CATASTROPHE!!)

2
répondu T.Todua 2015-03-13 13:58:20

je veux développer la réponse de @alcuadrado avec le commentaire de @Vijit pour la manipulation des liens symboliques. Premièrement, utilisez getRealPath (). Mais alors, si vous avez des liens symboliques que sont les dossiers qu'il échouera comme il essaie de l'appeler rmdir sur un lien - si vous avez besoin d'une vérification supplémentaire.

$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
    if ($file->isLink()) {
        unlink($file->getPathname());
    } else if ($file->isDir()){
        rmdir($file->getPathname());
    } else {
        unlink($file->getPathname());
    }
}
rmdir($dir);
2
répondu user701152 2017-06-06 14:10:12

quelque chose comme ça?

function delete_folder($folder) {
    $glob = glob($folder);
    foreach ($glob as $g) {
        if (!is_dir($g)) {
            unlink($g);
        } else {
            delete_folder("$g/*");
            rmdir($g);
        }
    }
}
1
répondu K-Gun 2013-01-30 13:13:20

supprimer tous les fichiers dans le dossier

array_map('unlink', glob("$directory/*.*"));

Supprimez tous .* - Fichiers dans le dossier (sans:"." et." .")

array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))

Maintenant, supprimez le dossier lui-même.

rmdir($directory)

1
répondu PP2000 2015-07-07 07:34:43

2 cents à ajouter à cette réponse ci-dessus, qui est grand BTW

après que votre fonction glob (ou similaire) a scanné/lu le répertoire, ajoutez une condition pour vérifier que la réponse n'est pas vide, ou un avertissement invalid argument supplied for foreach() sera lancé. Si...

if( ! empty( $files ) )
{
    foreach( $files as $file )
    {
        // do your stuff here...
    }
}

Ma fonction (comme une méthode de l'objet):

    private function recursiveRemoveDirectory( $directory )
    {
        if( ! is_dir( $directory ) )
        {
            throw new InvalidArgumentException( "$directory must be a directory" );
        }

        if( substr( $directory, strlen( $directory ) - 1, 1 ) != '/' )
        {
            $directory .= '/';
        }

        $files = glob( $directory . "*" );

        if( ! empty( $files ) )
        {
            foreach( $files as $file )
            {
                if( is_dir( $file ) )
                {
                    $this->recursiveRemoveDirectory( $file );
                }
                else
                {
                    unlink( $file );
                }
            }               
        }
        rmdir( $directory );

    } // END recursiveRemoveDirectory()
1
répondu Phil Meadows 2017-05-23 11:55:03

Voici la solution qui fonctionne parfaitement:

function unlink_r($from) {
    if (!file_exists($from)) {return false;}
    $dir = opendir($from);
    while (false !== ($file = readdir($dir))) {
        if ($file == '.' OR $file == '..') {continue;}

        if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
            unlink_r($from . DIRECTORY_SEPARATOR . $file);
        }
        else {
            unlink($from . DIRECTORY_SEPARATOR . $file);
        }
    }
    rmdir($from);
    closedir($dir);
    return true;
}
1
répondu Tarik 2017-12-20 06:48:32

à l'Aide de DirectoryIterator un équivalent d'une réponse précédente...

function deleteFolder($rootPath)
{   
    foreach(new DirectoryIterator($rootPath) as $fileToDelete)
    {
        if($fileToDelete->isDot()) continue;
        if ($fileToDelete->isFile())
            unlink($fileToDelete->getPathName());
        if ($fileToDelete->isDir())
            deleteFolder($fileToDelete->getPathName());
    }

    rmdir($rootPath);
}
1
répondu Alan Trewartha 2018-02-16 14:39:34

celui-ci travaille pour moi:

function removeDirectory($path) {
    $files = glob($path . '/*');
    foreach ($files as $file) {
        is_dir($file) ? removeDirectory($file) : unlink($file);
    }
    rmdir($path);
    return;
}
1
répondu Christopher Smit 2018-03-23 07:55:52
<?php
  function rrmdir($dir) {
  if (is_dir($dir)) {
    $objects = scandir($dir);
    foreach ($objects as $object) {
      if ($object != "." && $object != "..") {
        if (filetype($dir."/".$object) == "dir") 
           rrmdir($dir."/".$object); 
        else unlink   ($dir."/".$object);
      }
    }
    reset($objects);
    rmdir($dir);
  }
 }
?>

avez-vous trié le code obove de php.net

travailler pour moi fine

0
répondu Gaurang 2013-04-03 13:06:49

Pour windows:

system("rmdir ".escapeshellarg($path) . " /s /q");
0
répondu Mylo 2013-11-01 16:59:20

comme la solution de Playnox, mais avec l'élégant DirectoryIterator intégré:

function delete_directory($dirPath){
 if(is_dir($dirPath)){
  $objects=new DirectoryIterator($dirPath);
   foreach ($objects as $object){
    if(!$object->isDot()){
     if($object->isDir()){
      delete_directory($object->getPathname());
     }else{
      unlink($object->getPathname());
     }
    }
   }
   rmdir($dirPath);
  }else{
   throw new Exception(__FUNCTION__.'(dirPath): dirPath is not a directory!');
  }
 }
0
répondu Matthew Slyman 2015-01-07 09:13:43

Je ne me souviens pas d'où j'ai copié cette fonction, mais il semble qu'elle ne soit pas listée et qu'elle fonctionne pour moi

function rm_rf($path) {
    if (@is_dir($path) && is_writable($path)) {
        $dp = opendir($path);
        while ($ent = readdir($dp)) {
            if ($ent == '.' || $ent == '..') {
                continue;
            }
            $file = $path . DIRECTORY_SEPARATOR . $ent;
            if (@is_dir($file)) {
                rm_rf($file);
            } elseif (is_writable($file)) {
                unlink($file);
            } else {
                echo $file . "is not writable and cannot be removed. Please fix the permission or select a new path.\n";
            }
        }
        closedir($dp);
        return rmdir($path);
    } else {
        return @unlink($path);
    }
}
0
répondu dav 2015-08-12 13:39:48

Simple et facile...

$dir ='pathtodir';
if (is_dir($dir)) {
  foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
    if ($filename->isDir()) continue;
    unlink($filename);
  }
  rmdir($dir);
}
0
répondu Newtron 2016-05-27 11:34:08

exemple pour le serveur Linux: exec('rm -f -r ' . $cache_folder . '/*');

0
répondu realmag777 2017-07-12 15:00:05

et ça?

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

      foreach( $files as $file )
      {
          Delete_Directory( $file );      
      }
      if(file_exists($Dir))
      {
          rmdir($Dir);
      }
  } 
  elseif(is_file($Dir)) 
  {
     unlink( $Dir );  
  }
}

Refrence: https://paulund.co.uk/php-delete-directory-and-files-in-directory

0
répondu Mohamad Hamouday 2017-12-25 09:28:13

si vous n'êtes pas sûr, le chemin donné est un répertoire ou un fichier, alors vous pouvez utiliser cette fonction pour supprimer le chemin

function deletePath($path) {
        if(is_file($path)){
            unlink($path);
        } elseif(is_dir($path)){
            $path = (substr($path, -1) !== DIRECTORY_SEPARATOR) ? $path . DIRECTORY_SEPARATOR : $path;
            $files = glob($path . '*');
            foreach ($files as $file) {
                deleteDirPath($file);
            }
            rmdir($path);
        } else {
            return false;
        }
}
0
répondu jay padaliya 2018-07-23 10:01:19

Voici une solution simple

$dirname = $_POST['d'];
    $folder_handler = dir($dirname);
    while ($file = $folder_handler->read()) {
        if ($file == "." || $file == "..")
            continue;
        unlink($dirname.'/'.$file);

    }
   $folder_handler->close();
   rmdir($dirname);
-2
répondu majo 2013-01-06 15:42:19

code indépendant de la plate-forme.

a pris le réponse de PHP.net

if(PHP_OS === 'Windows')
{
 exec("rd /s /q {$path}");
}
else
{
 exec("rm -rf {$path}");
}
-4
répondu mysticmo 2016-01-11 14:10:42