rmdir

(PHP 4, PHP 5, PHP 7, PHP 8)

rmdir删除目录

描述

rmdir(string $directory, ?resource $context = null): bool

尝试删除名为 directory 的目录。该目录必须为空,并且相关的权限必须允许此操作。如果失败,将生成一个 E_WARNING 级别的错误。

参数

directory

目录的路径。

context

一个 上下文流 resource

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 rmdir() 示例

<?php
if (!is_dir('examples')) {
mkdir('examples');
}

rmdir('examples');
?>

参见

添加备注

用户贡献的备注 29 个备注

207
nbari at dalmp dot com
11 年前
Glob 函数不返回隐藏文件,因此在尝试递归删除树时,scandir 可能更有用。

<?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);
}
?>
37
itay at itgoldman dot com
9 年前
一些递归文件夹删除的实现效果并不好(有些会发出警告,有些不会删除隐藏文件等)。

这个效果很好。
<?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);
}

?>
47
info at top-info dot org
14 年前
当你没有真正注意时,delTree 函数很危险。例如,我一直用它来删除一个临时目录。一切都很好,直到包含这个临时目录的变量没有设置。该变量没有包含路径,而是包含一个空字符串。delTree 函数被调用并删除了我主机上的所有文件!
因此,当你没有编写适当的处理程序时,请勿使用此函数。不要考虑只在没有这种处理程序的情况下使用此函数进行测试。
幸运的是,我还有本地副本,所以没有丢失任何东西。
36
dj dot thd at hotmail dot com
8 年前
永远不要使用 jurchiks101 at gmail dot com 的代码!!!它包含命令注入漏洞!!!
如果你想这样做,请改用类似这样的代码:

<?php
if (PHP_OS === 'Windows')
{
exec(sprintf("rd /s /q %s", escapeshellarg($path)));
}
else
{
exec(sprintf("rm -rf %s", escapeshellarg($path)));
}
?>

注意使用 escapeshellarg 来转义任何可能的不需要的字符,这避免将命令放在 $path 变量中,因此有人用这段代码“入侵”服务器的可能性就不存在。
44
holger1 at NOSPAMzentralplan dot de
14 年前
另一种递归删除非空目录的简单方法。

<?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);
}
}
?>
14
wolfoneil at gmx.de
9 年前
我正在处理一些数据操作,想和你分享一个 OOP 方法。

它只是删除目录中的所有内容,但不会删除目标目录本身!如果你想清理备份目录或日志,它非常有用。

你也可以在出现错误或完成工作时测试它!

例如,我在 FileHandler 类中使用它,享受吧!

<?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 ){
// 写入日志
return false;
}
return
true;
}

?>
6
steffen at wirsching-idstein dot de
14 年前
假设你在 Windows 上工作,并且一直收到权限错误,但没有原因。那么可能是另一个 Windows 程序正在使用该文件夹(参见之前的笔记)。如果你找不到该程序,以下代码

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

可以解决这个问题!
确保在 rmdir($dirname); 之前编写此代码。
8
Anonymous
7 年前
如果 $src 目录不存在,itay 的函数会陷入无限循环。
这是一个修复方法 - 在循环之前应该至少进行一次 file_exists() 检查

function rrmdir($src) {
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);
}
}

感谢 itay 提供了原始函数,它很有用。
6
shane dot ray87 at gmail dot com
13 年前
这个问题困扰了我好几个小时。

我在 IIS 上运行 PHP,安装了 wincache 模块,在运行递归删除时,某个文件夹会“卡住”并抛出权限错误。我无法使用 PHP 或 Windows 本身删除它们。唯一能删除该文件夹的方法是等待 5 分钟,然后再次运行脚本,或者停止 IIS 服务器,然后该文件夹会自行删除。禁用 wincache 模块解决了这个问题。

希望这有帮助。
5
Chris Wren
11 年前
在 Windows 上删除文件夹时,我也遇到了权限问题,解决方案是关闭所有打开了位于该文件夹结构中的文件的编辑器。
5
thomas
12 年前
O S 在 2010 年 6 月 18 日 11:30 给出的 deleteAll 函数将在以下行失败

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

如果在遍历层次结构时找到一个名为 0(零)的文件夹
13
lprent at primary dot geek dot nz
10 年前
递归进入符号链接目录非常危险。delTree 应该被修改以检查链接。

<?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);
}
?>
5
tuxedobob
10 年前
请记住,如果你知道你的主机操作系统是什么,你总是可以通过 exec() 等方法调用相应的系统调用。例如

exec('rmdir folder-to-delete /s /q'); //windows
exec('rmdir -rf folder-to-delete'); //OS X/*nix?
4
ahmadmarafa at gmail dot com
9 年前
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) ;
}

}
2
mmakshita2398 at gmail dot com
5 年前
它会删除文件夹中的所有文件,以及该文件夹本身...

echo $path = 'D:\xampp\htdocs\New folder\New folder';

function rmdir_recursive($dir) {
$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);
3
rn at clubfl dot com
16 年前
我注意到,在 Windows 平台上使用此命令时,你可能会遇到看似毫无道理的权限错误。这通常发生在你使用程序编辑要删除的文件夹中的内容时,并且该项仍然在文件夹中,或者正在访问该文件夹中文件的程序仍在运行(导致它保留该文件夹)。

所以... 如果你遇到权限错误,并且不应该存在文件夹权限问题,请检查该文件夹中是否存在文件,然后检查是否存在正在使用该文件夹中文件的程序,并将其终止。
4
omikrosys at gmail dot com
14 年前
有时你会遇到 rmdir($dirname) 会给出“权限被拒绝”错误的情况,尽管你可能已更改了 $dirname 的权限。在这种情况下,只需更改包含 $dirname 的目录的权限,rmdir($dirname) 就可以正常工作。
例如,你使用 rmdir('dirr'); 然后更改包含 'dirr' 的文件夹的权限。
2
Baraka Mghumba
9 年前
在 PHP 5.4(EasyPHP 服务器)上测试,运行良好。
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 '删除成功!';
}
else
{
return '删除失败!';
}
}
else
{
return '不存在或无法访问!';
}
}
需要注意的是
如果有必要,你需要处理文件权限
4
asn at asn24 dot dk
15 年前
对先前脚本的修补程序,以确保设置删除权限

<?php
// 删除文件夹函数
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);
}
?>

[编辑说明:“感谢 erkethan at free dot fr。” - thiago]
1
O S
14 年前
这不是我的代码,但我认为我会分享,因为它让我花了很长时间才找到。这是一个删除文件夹、所有子文件夹和文件的函数,一步到位。

只需告诉它你想要删除哪个目录,与执行此函数的页面相关。然后,如果你只想清空文件夹而不删除,请设置 $empty = true。如果你设置 $empty = false,或者只是简单地省略它,则给定目录也会被删除。

<?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;
}
}
?>
1
samy dot see at gmail dot com
13 年前
如果您在 Windows 上测试您的网站时遇到了“权限被拒绝”的问题,那么这可能会解决问题

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

然后

<?php rmdir($path); ?>
0
dev dot abi dot log at gmail dot com
1 年前
一个简单的代码片段,用于递归删除空目录

<?php
function removeEmptyDirs($fullPath)
{
if(!
is_dir($fullPath)){
return;
}

$children = array_diff(scandir($fullPath), ['.','..']);

foreach(
$children as $child){
removeEmptyDirs($fullPath. $child. DIRECTORY_SEPARATOR);
}

$children = array_diff(scandir($fullPath), ['.','..']);
if(empty(
$children)){
echo
"the $fullPath empty directory has been removed.\n";
rmdir($fullPath);
}
}
?>
0
anonymous_user
3 年前
// 递归 PHP 函数,用于完全删除目录

function delete_directory_recursively( $path ) {

$dir = new \DirectoryIterator( $path );

// 遍历提供的目录的子目录/文件
foreach ( $dir as $dir_info ) {

// 从目录迭代中排除 .(当前目录)和 ..(父目录)路径
// 从目录迭代
if ( ! $dir_info->isDot() ) {

// 获取当前迭代的完整路径
$iterated_path = $dir_info->getPathname();

// 如果当前迭代的路径是一个目录
if ( $dir_info->isDir() ) {

// 且该目录不为空(在这种情况下,scandir 返回的数组中包含的元素不止 2 个(. 和 ..))
if ( count( scandir( $iterated_path ) ) !== 2 ) {

// 递归调用函数
self::remove_directory_recursively( $iterated_path );

} else {

// 如果当前迭代的路径是一个空目录,则将其删除
rmdir( $iterated_path );

}

} elseif ( $dir_info->isFile() ) {

// 如果当前迭代的路径描述了一个文件,我们需要
// 删除该文件
unlink( $iterated_path );

}

} // 循环,在当前迭代的目录既不是 . 也不是 .. 时打开

} // 结束遍历提供的路径的目录/文件

// 在遍历完提供的路径的子路径后,删除
// 相关的路径
rmdir( $path );

} // 结束 delete_directory_recursively() 函数定义
1
TrashF at taistelumarsu dot org
16 年前
如果您试图使用 rmdir() 但一直遇到“权限被拒绝”错误,请确保在使用 opendir() 后没有打开该目录。特别是在编写用于删除目录的递归函数时,请确保在 rmdir() 之前执行 closedir()。
1
longears at BLERG dot gmail dot com
12 年前
递归删除目录的简洁方法

<?php
# 递归删除目录
function rrmdir($dir) {
foreach(
glob($dir . '/*') as $file) {
if(
is_dir($file))
rrmdir($file);
else
unlink($file);
}
rmdir($dir);
}
?>
0
bcairns at gmail dot com
15 年前
我尝试了下面的递归删除函数,但没有成功,所以我写了我的自己的函数

<?php
// 确保 $dir 以斜杠结尾
function delTree($dir) {
$files = glob( $dir . '*', GLOB_MARK );
foreach(
$files as $file ){
if(
substr( $file, -1 ) == '/' )
delTree( $file );
else
unlink( $file );
}
rmdir( $dir );
}
?>

简单易行,有效。
-1
kevin at web-power dot co dot uk
14 年前
我遇到了 rmdir 返回警告消息的情况,因为在最后一次循环中它已经被删除了。所以,这里通过在 DelTree 例程中添加 is_dir 来快速修复

<?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 );

}
?>
-2
YAPs
8 年前
此版本删除树

<?PHP

if(!defined('DS'))define("DS",DIRECTORY_SEPARATOR);

function
delTree($folder,$del_root=true)
{
$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";
}
?>
-3
frederico05 dot figueira at gmail dot com
8 年前
//这是一个删除包含所有文件的完整目录的示例

function delDir($path){
if(is_dir($path) == TRUE){
$rootFolder = scandir($path);
if(sizeof($rootFolder) > 2){
foreach($rootFolder as $folder){
if($folder != "." && $folder != ".."){
//将子文件夹传递给函数
delDir($path."/".$folder);
}
}
//在foreach循环结束时,目录将被清空,您可以使用rmdir删除它
rmdir($path);
}
}else{
if(file_exists($path) == TRUE){
unlink($path);
}
}
}
To Top