International PHP Conference 2015

rmdir

(PHP 4, PHP 5)

rmdirRimuove una directory

Descrizione

bool rmdir ( string $dirname [, resource $context ] )

Tenta di cancellare la directory indiata da pathname. La directory deve essere vuota e i permessi concessi devono permetterlo. Restituisce TRUE in caso di successo, FALSE in caso di fallimento.

Nota: Dal PHP 5.0.0 rmdir() può anche essere utilizzata con qualche wrapper URL. Fare riferimento a Supported Protocols and Wrappers per avere l'elenco dei wrapper supportati da rmdir().

Nota: Il parametro context è stato aggiunto in PHP 5.0.0.

Nota: Quando safe-mode è abilitato, PHP controlla che la directory nella quale si sta lavorando, abbia lo stesso UID dello script che è in esecuzione.

Vedere anche mkdir() e unlink().

add a note add a note

User Contributed Notes 23 notes

up
83
nbari at dalmp dot com
2 years ago
Glob function doesn't return the hidden files, therefore scandir can be more useful, when trying to delete recursively a tree.

<?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);
  }
?>
up
22
info at top-info dot org
5 years ago
The function delTree is dangerous when you dont take really care. I for example always deleted a temporary directory with it. Everthing went fine until the moment where the var containing this temporary directory wasnt set. The var didnt contain the path but an empty string. The function delTree  was called and deleted all the files at my host!
So dont use this function when you dont have a proper handling coded. Dont think about using this function only for testing without such a handling.
Luckily nothing is lost because I had the local copy...
up
12
jurchiks101 at gmail dot com
1 year ago
This function sorely needs a built-in option to delete the contents of the directory. Or another function that does exactly that - deletes a path (file or folder, doesn't matter).
It is still much simpler to just use something like the following to delete any directory rather than write some 10+ line function that has corner cases that will break it:
<?php
if (PHP_OS === 'Windows')
{
   
exec("rd /s /q {$path}");
}
else
{
   
exec("rm -rf {$path}");
}
?>
Most webservers are run on 2 or 3 different popular operating systems, so this would easily work for almost all websites.
up
2
Chris Wren
2 years ago
I also ran into the permissions issue in Windows when deleting a folder and the solution was to close all editors which had files opened which were located in the folder structure.
up
19
holger1 at NOSPAMzentralplan dot de
5 years ago
Another simple way to recursively delete a directory that is not empty:

<?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);
   }
}
?>
up
1
steffen at wirsching-idstein dot de
5 years ago
Say, you're working on Windows and continue to get a permission's error without a reason. Then it may be that a different Windows program is working on the folder (see earlier notes also). In the case that you can't find that program, the line

<?php closedir(opendir($dirname)); ?>

may solve the problem!
Make sure to write this before rmdir($dirname);.
up
2
O S
5 years ago
This isn't my code, but just thought I would share, since it took me so long to find. This is a function to delete a folder, all sub-folders, and files in one clean move.

Just tell it what directory you want deleted, in relation to the page that this function is executed. Then set $empty = true if you want the folder just emptied, but not deleted. If you set $empty = false, or just simply leave it out, the given directory will be deleted, as well.

<?php
function deleteAll($directory, $empty = false) {
    if(
substr($directory,-1) == "/") {
       
$directory = substr($directory,0,-1);
    }

    if(!
file_exists($directory) || !is_dir($directory)) {
        return
false;
    } elseif(!
is_readable($directory)) {
        return
false;
    } else {
       
$directoryHandle = opendir($directory);
       
        while (
$contents = readdir($directoryHandle)) {
            if(
$contents != '.' && $contents != '..') {
               
$path = $directory . "/" . $contents;
               
                if(
is_dir($path)) {
                   
deleteAll($path);
                } else {
                   
unlink($path);
                }
            }
        }
       
       
closedir($directoryHandle);

        if(
$empty == false) {
            if(!
rmdir($directory)) {
                return
false;
            }
        }
       
        return
true;
    }
}
?>
up
5
lprent at primary dot geek dot nz
1 year ago
It is rather dangerous to recurse into symbolically linked directories. The delTree should be modified to check for links.

<?php
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);
  }
?>
up
1
shane dot ray87 at gmail dot com
4 years ago
This issue has been driving me nuts for hours.

I am running PHP on IIS, I had the wincache module installed, when running a recursive delete a certain folder would get "stuck" and throw permissions errors.  I was not able to delete them with PHP or in windows itself.  The only way to delete the folder was to wait 5 min and run the script again, or stop the IIS server and the folder would delete on its own.  Disabling the wincachce module resolved the issue.

Hope this helps.
up
2
asn at asn24 dot dk
6 years ago
A patch to previous script to make sure rights for deletion is set:

<?php
//Delete folder function
function deleteDirectory($dir) {
    if (!
file_exists($dir)) return true;
    if (!
is_dir($dir) || is_link($dir)) return unlink($dir);
        foreach (
scandir($dir) as $item) {
            if (
$item == '.' || $item == '..') continue;
            if (!
deleteDirectory($dir . "/" . $item)) {
               
chmod($dir . "/" . $item, 0777);
                if (!
deleteDirectory($dir . "/" . $item)) return false;
            };
        }
        return
rmdir($dir);
    }
?>

[EDITOR NOTE: "Credits to erkethan at free dot fr." - thiago]
up
1
TrashF at taistelumarsu dot org
7 years ago
In case you're trying to rmdir() and you keep getting 'Permission denied' errors, make sure you don't have the directory still open after using opendir(). Especially when writing recursive functions for deleting directories, make sure you have closedir() BEFORE rmdir().
up
1
omikrosys at gmail dot com
5 years ago
Sometimes you would face situations in which rmdir($dirname) would give "permission denied" errors though you may have changed $dirname permissions. In such situations just change the permissions of the directory which contains $dirname and rmdir($dirname) would work like a charm.
Say you use rmdir('dirr'); then change the permissions of the folder that contains 'dirr'.
up
2
wolfoneil at gmx.de
7 months ago
I was working on some Dataoperation, and just wanted to share an OOP method with you.

It just removes any contents of a Directory but not the target Directory itself! Its really nice if you want to clean a BackupDirectory or Log.

Also you can test on it if something went wrong or if it just done its Work!

I have it in a FileHandler class for example, enjoy!

<?php

 
public function deleteContent($path){
      try{
       
$iterator = new DirectoryIterator($path);
        foreach (
$iterator as $fileinfo ) {
          if(
$fileinfo->isDot())continue;
          if(
$fileinfo->isDir()){
            if(
deleteContent($fileinfo->getPathname()))
              @
rmdir($fileinfo->getPathname());
          }
          if(
$fileinfo->isFile()){
            @
unlink($fileinfo->getPathname());
          }
        }
      } catch (
Exception $e ){
        
// write log
        
return false;
      }
      return
true;
    }

?>
up
2
Baraka Mghumba
1 year ago
Works fine, tested on PHP 5.4(EasyPHP server)
function deletedir($dir)
    {
        if (is_dir($dir))
        {
            $files = scandir($dir);
            foreach ($files as $file)
            {
                if ($file != "." && $file != "..")
                {
                    if (filetype($dir."/".$file) == "dir")
                    {
                        $this->deletedir($dir."/".$file);
                    }
                    else
                    {
                        unlink($dir."/".$file);
                    }
                }
            }
            reset($objects);
            if(rmdir($dir))
            {
                return 'deleted successfully!';
            }
            else
            {
                return 'delete failed!';
            }
        }
        else
        {
            return 'doesn\'t exist or inaccessible!';
        }
    }
Something to note:
You have to take care of file permission if necessary
up
1
itay at itgoldman dot com
3 months ago
some implementations of recursive folder delete don't work so well (some give warnings, other don't delete hidden files etc).

this one is working fine:
<?php

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

?>
up
1
ahmadmarafa at gmail dot com
11 months ago
function unlinkDir($dir)
{
    $dirs = array($dir);
    $files = array() ;
    for($i=0;;$i++)
    {
        if(isset($dirs[$i]))
            $dir =  $dirs[$i];
        else
            break ;
   
        if($openDir = opendir($dir))
        {
            while($readDir = @readdir($openDir))
            {
                if($readDir != "." && $readDir != "..")
                {
                
                    if(is_dir($dir."/".$readDir))
                    {
                        $dirs[] = $dir."/".$readDir ;
                    }
                    else
                    {
                       
                        $files[] = $dir."/".$readDir ;
                    }
                }
            }
       
        }
       
    }
   
   
   
    foreach($files as $file)
    {
        unlink($file) ;
    
    }
    $dirs = array_reverse($dirs) ;
    foreach($dirs as $dir)
    {
        rmdir($dir) ;
    }
   
}
up
0
tuxedobob
1 year ago
Keep in mind that if you know what your host OS is, you can always just call the appropriate system call using exec() or the like. For example:

exec('rmdir folder-to-delete /s /q'); //windows
exec('rmdir -rf folder-to-delete'); //OS X/*nix?
up
0
longears at BLERG dot gmail dot com
3 years ago
Concise way to recursively remove a directory:

<?php
# recursively remove a directory
function rrmdir($dir) {
    foreach(
glob($dir . '/*') as $file) {
        if(
is_dir($file))
           
rrmdir($file);
        else
           
unlink($file);
    }
   
rmdir($dir);
}
?>
up
0
rn at clubfl dot com
7 years ago
I've noticed that when using this command on a windows platform you may encounter a permissions error which may seem unwarranted. This commonly occurs if you are or were using a program to edit something in the to be deleted folder and either the item is still in the folder or the program that was accessing the file in that folder is still running(causing it to hold onto the folder).

SO... if you get a permissions error and there shouldn't be an issue with folder permissions check if there are files in there then check if there is a program running that is or was using a file that was in that folder and kill it.
up
-1
thomas
3 years ago
Function deleteAll given by O S on 18-Jun-2010 11:30 will fail at line

while ($contents = readdir($directoryHandle)) {...

if a folder named 0 (zero) is found during traversing the hierarchy
up
-2
bcairns at gmail dot com
6 years ago
I wasn't having much luck with the recursive delete functions below, so I wrote my own:

<?php
// 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 );
}
?>

Simple.  Works.
up
-3
samy dot see at gmail dot com
4 years ago
if you get this problem Permission denied in windows testing your site maybe this will resolve the problem

<?php
if(file_exists($path.'/Thumbs.db')){
   
unlink($path.'/Thumbs.db');
}
?>

and then

<?php rmdir($path); ?>
up
-4
kevin at web-power dot co dot uk
5 years ago
I had situation where the rmdir was returning warning message as within last loop it was already removed. So here is quick fix by adding is_dir to the DelTree routine below

<?php
function delTree($dir) {
   
$files = glob( $dir . '*', GLOB_MARK );
    foreach(
$files as $file ){
        if(
substr( $file, -1 ) == '/' )
           
delTree( $file );
        else
           
unlink( $file );
    }
   
    if (
is_dir($dir)) rmdir( $dir );
   
}
?>
To Top