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.
30 réponses
il y a au moins deux options disponibles aujourd'hui.
-
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); }
-
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);
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);
Quelle est la meilleure façon de supprimer un répertoire avec tous ses fichiers?
system("rm -rf ".escapeshellarg($dir));
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);
}
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);
}
}
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);
}
?>
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
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);
}
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);
}
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);
}
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);
}
?>
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);
}
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!!)
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);
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);
}
}
}
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)
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()
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;
}
à 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);
}
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;
}
<?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
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!');
}
}
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);
}
}
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);
}
exemple pour le serveur Linux: exec('rm -f -r ' . $cache_folder . '/*');
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
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;
}
}
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);