set_file_buffer »
« rewind
- PHP Manual
- Function Reference
- File System Related Extensions
- Filesystem
- Filesystem Functions
(PHP 4, PHP 5, PHP 7, PHP 8)
rmdir — Removes directory
Description
rmdir(string $directory
, ?resource $context
= null
): bool
Attempts to remove the directory named by directory
. The directory must be empty, and the relevant permissions must permit this. A E_WARNING
level error will be generated on failure.
Parameters
directory
-
Path to the directory.
context
-
A context streamresource.
Return Values
Returns true
on success or false
on failure.
Examples
Example #1 rmdir() example
<?php
if (!is_dir('examples')) {
mkdir('examples');
}rmdir('examples');
?>
See Also
- is_dir() - Tells whether the filename is a directory
- mkdir() - Makes directory
- unlink() - Deletes a file
Improve This Page
+add a note
User Contributed Notes 29 notes
up
down
207
nbari at dalmp dot com ¶
11 years ago
<?phpGlob function doesn't return the hidden files, therefore scandir can be more useful, when trying to delete recursively a tree.
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
down
37
itay at itgoldman dot com ¶
9 years ago
this one is working fine:some implementations of recursive folder delete don't work so well (some give warnings, other don't delete hidden files etc).
<?phpfunction 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
down
47
info at top-info dot org ¶
14 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
down
36
dj dot thd at hotmail dot com ¶
8 years ago
<?phpNever ever use jurchiks101 at gmail dot com code!!! It contains command injection vulnerability!!!
If you want to do it that way, use something like this instead:
if (PHP_OS === 'Windows')
{
exec(sprintf("rd /s /q %s", escapeshellarg($path)));
}
else
{
exec(sprintf("rm -rf %s", escapeshellarg($path)));
}
?>
Note the escapeshellarg usage to escape any possible unwanted character, this avoids putting commands in $path variable so the possibility of someone "pwning" the server with this code
up
down
44
holger1 at NOSPAMzentralplan dot de ¶
14 years ago
<?phpAnother simple way to recursively delete a directory that is not empty:
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
down
14
wolfoneil at gmx.de ¶
9 years ago
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){I was working on some Dataoperation, and just wanted to share an OOP method with you.
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
down
6
steffen at wirsching-idstein dot de ¶
14 years ago
<?php closedir(opendir($dirname)); ?>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
may solve the problem!
Make sure to write this before rmdir($dirname);.
up
down
8
Anonymous ¶
7 years ago
function rrmdir($src) { Thanks to itay for the original function, though, it was helpful.itay at itgoldman's function falls into an infinite loop if the $src directory doesn't exist.
Here's a fix - one should do at least a file_exists() check before the loop:
if (file_exists($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
down
6
shane dot ray87 at gmail dot com ¶
13 years ago
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.This issue has been driving me nuts for hours.
up
down
5
Chris Wren ¶
12 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
down
5
thomas ¶
12 years ago
while ($contents = readdir($directoryHandle)) {... if a folder named 0 (zero) is found during traversing the hierarchyFunction deleteAll given by O S on 18-Jun-2010 11:30 will fail at line
up
down
13
lprent at primary dot geek dot nz ¶
10 years ago
<?php It is rather dangerous to recurse into symbolically linked directories. The delTree should be modified to check for links.
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
down
5
tuxedobob ¶
10 years ago
exec('rmdir folder-to-delete /s /q'); //windowsKeep 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 -rf folder-to-delete'); //OS X/*nix?
up
down
4
ahmadmarafa at gmail dot com ¶
9 years ago
if($openDir = opendir($dir)) if(is_dir($dir."/".$readDir)) $files[] = $dir."/".$readDir ; } } foreach($files as $file) } }function unlinkDir($dir)
{
$dirs = array($dir);
$files = array() ;
for($i=0;;$i++)
{
if(isset($dirs[$i]))
$dir = $dirs[$i];
else
break ;
{
while($readDir = @readdir($openDir))
{
if($readDir != "." && $readDir != "..")
{
{
$dirs[] = $dir."/".$readDir ;
}
else
{
}
}
}
{
unlink($file) ;
$dirs = array_reverse($dirs) ;
foreach($dirs as $dir)
{
rmdir($dir) ;
}
up
down
2
mmaksh*ta2398 at gmail dot com ¶
5 years ago
echo $path = 'D:\xampp\htdocs\New folder\New folder'; function rmdir_recursive($dir) {it Will Delete All Fildes in folder and that folder too...
$it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$it = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($it as $file) {
if ($file->isDir()) rmdir($file->getPathname());
else unlink($file->getPathname());
}
rmdir($dir);
}
rmdir_recursive($path);
up
down
3
rn at clubfl dot com ¶
16 years ago
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.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).
up
down
4
omikrosys at gmail dot com ¶
14 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
down
2
Baraka Mghumba ¶
10 years 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
down
4
asn at asn24 dot dk ¶
15 years ago
<?phpA patch to previous script to make sure rights for deletion is set:
//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
down
1
O S ¶
14 years ago
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 if(! while ( if( if( return 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.
function deleteAll($directory, $empty = false) {
if(substr($directory,-1) == "/") {
$directory = substr($directory,0,-1);
}
return false;
} elseif(!is_readable($directory)) {
return false;
} else {
$directoryHandle = opendir($directory);
if($contents != '.' && $contents != '..') {
$path = $directory . "/" . $contents;
deleteAll($path);
} else {
unlink($path);
}
}
}closedir($directoryHandle);
if(!rmdir($directory)) {
return false;
}
}
}
}
?>
up
down
1
samy dot see at gmail dot com ¶
13 years ago
<?php <?php rmdir($path); ?>if you get this problem Permission denied in windows testing your site maybe this will resolve the problem
if(file_exists($path.'/Thumbs.db')){
unlink($path.'/Thumbs.db');
}
?>
and then
up
down
dev dot abi dot log at gmail dot com ¶
2 years ago
<?php foreach(a simple snipped for removing empty dirs recursive :
function removeEmptyDirs($fullPath)
{
if(!is_dir($fullPath)){
return;
}$children = array_diff(scandir($fullPath), ['.','..']);
removeEmptyDirs($fullPath. $child. DIRECTORY_SEPARATOR);
}$children = array_diff(scandir($fullPath), ['.','..']);
if(empty($children)){
echo "the $fullPath empty directory has been removed.\n";
rmdir($fullPath);
}
}
?>
up
down
anonymous_user ¶
3 years ago
function delete_directory_recursively( $path ) { $dir = new \DirectoryIterator( $path ); // Iterate through the subdirectories / files of the provided directory // Exclude the . (current directory) and .. (parent directory) paths // Get the full currently iterated path // If the currently iterated path is a directory // which is not empty (in which case scandir returns an array of not 2 (. and ..) elements) // Call the function recursively } else { // if the currently iterated path is an empty directory, remove it } } elseif ( $dir_info->isFile() ) { // If the currently iterated path describes a file, we need to } } // loop which opens if the currently iterated directory is neither . nor .. } // end of iteration through directories / files of provided path // After iterating through the subpaths of the provided path, remove the } // end of delete_directory_recursively() function definition// Recursive PHP function to completely remove a directory
foreach ( $dir as $dir_info ) {
// from the directory iteration
if ( ! $dir_info->isDot() ) {
$iterated_path = $dir_info->getPathname();
if ( $dir_info->isDir() ) {
if ( count( scandir( $iterated_path ) ) !== 2 ) {
self::remove_directory_recursively( $iterated_path );
rmdir( $iterated_path );
// delete that file
unlink( $iterated_path );
// concerned path
rmdir( $path );
up
down
1
TrashF at taistelumarsu dot org ¶
16 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
down
1
longears at BLERG dot gmail dot com ¶
12 years ago
<?phpConcise way to recursively remove a directory:
# recursively remove a directory
function rrmdir($dir) {
foreach(glob($dir . '/*') as $file) {
if(is_dir($file))
rrmdir($file);
else
unlink($file);
}
rmdir($dir);
}
?>
up
down
bcairns at gmail dot com ¶
15 years ago
<?phpI wasn't having much luck with the recursive delete functions below, so I wrote my own:
// 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
down
-1
kevin at web-power dot co dot uk ¶
14 years ago
<?php if ( }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
function delTree($dir) {
$files = glob( $dir . '*', GLOB_MARK );
foreach( $files as $file ){
if( substr( $file, -1 ) == '/' )
delTree( $file );
else
unlink( $file );
}
up
down
-2
YAPs ¶
8 years ago
<?PHPif(!defined('DS'))define("DS",DIRECTORY_SEPARATOR); function This version delete tree
{
$folder=trim($folder,DS).DS;
$f=glob($folder.'*',GLOB_MARK);
if(count($f)>0)
foreach($f as $e)
{
if(is_dir($e))
delTree($e);
else
unlink($e);
}
if($del_root)
rmdir($folder);
if(!file_exists($folder))
return $folder." is deleted";
else
return $folder." not deleted";
}
?>
up
down
-3
frederico05 dot figueira at gmail dot com ¶
8 years ago
function delDir($path){//This is one example to delete full directory with all files inside there
if(is_dir($path) == TRUE){
$rootFolder = scandir($path);
if(sizeof($rootFolder) > 2){
foreach($rootFolder as $folder){
if($folder != "." && $folder != ".."){
//Pass the subfolder to function
delDir($path."/".$folder);
}
}
//On the end of foreach the directory will be cleaned, and you will can use rmdir, to remove it
rmdir($path);
}
}else{
if(file_exists($path) == TRUE){
unlink($path);
}
}
}
+add a note