PHP Conference Japan 2024

rmdir

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

rmdir删除目录

描述

rmdir(字符串 $directory, ?资源 $context = null): 布尔值

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

参数

directory

目录路径。

context

一个 上下文流 资源

返回值

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

示例

示例 #1 rmdir() 示例

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

rmdir('examples');
?>

参见

添加注释

用户贡献的注释 25 条注释

nbari at dalmp dot com
12 年前
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);
}
?>
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);
}

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

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

请注意 escapeshellarg 的使用以转义任何可能不需要的字符,这避免了将命令放入 $path 变量中,因此有人使用此代码“入侵”服务器的可能性
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);
}
}
?>
[email protected]
9 年前
我正在处理一些数据操作,只是想与大家分享一个面向对象的方法。

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

您还可以测试一下是否有任何错误发生或它是否已完成工作!

例如,我将其放在一个 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;
}

?>
[email protected]
14 年前
假设您在 Windows 上工作,并且无缘无故地持续收到权限错误。那么可能是另一个 Windows 程序正在操作该文件夹(另请参阅之前的说明)。如果您找不到该程序,则以下代码行

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

可能会解决问题!
确保在 rmdir($dirname); 之前编写此代码。
匿名用户
8 年前
如果 $src 目录不存在,itay@itgoldman 的函数将陷入无限循环。
这是一个修复方法 - 至少应该在循环之前进行 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 提供了原始函数,它很有帮助。
[email protected]
13 年前
这个问题困扰了我几个小时。

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

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

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

如果在遍历层次结构期间找到名为 0(零)的文件夹
tuxedobob
10 年前
请记住,如果您知道主机操作系统是什么,您始终可以使用 exec() 等调用相应的系统调用。例如

exec('rmdir folder-to-delete /s /q'); //Windows
exec('rmdir -rf folder-to-delete'); //OS X/*nix?
[email protected]
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);
}
?>
[email protected]
10 年前
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) ;
}

}
[email protected]
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);
[email protected]
16 年前
我注意到,在 Windows 平台上使用此命令时,您可能会遇到看似毫无根据的权限错误。如果您正在或曾经使用程序编辑要删除的文件夹中的某些内容,并且该项目仍在文件夹中或访问该文件夹中文件的程序仍在运行(导致它保留文件夹),则通常会发生这种情况。

所以……如果您收到权限错误并且文件夹权限不应该有问题,请检查其中是否有文件,然后检查是否有正在运行的程序正在或曾经使用过该文件夹中的文件并将其终止。
[email protected]
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);
}
?>

[编辑注:“感谢free dot fr上的erkethan。” - thiago]
omikrosys at gmail dot com
15 年前
有时您会遇到rmdir($dirname) 会给出“权限被拒绝”错误的情况,尽管您可能已经更改了$dirname的权限。在这种情况下,只需更改包含$dirname的目录的权限,rmdir($dirname) 就会像魅力一样工作。
假设您使用rmdir('dirr');然后更改包含'dirr'的文件夹的权限。
Baraka Mghumba
10 年前
运行良好,在PHP 5.4(EasyPHP服务器)上测试过
函数deletedir($dir)
{
如果(is_dir($dir))
{
$files = scandir($dir);
foreach ($files as $file)
{
如果 ($file != "." && $file != "..")
{
如果 (filetype($dir."/".$file) == "dir")
{
$this->deletedir($dir."/".$file);
}
else
{
unlink($dir."/".$file);
}
}
}
reset($objects);
如果(rmdir($dir))
{
返回“已成功删除!”;
}
else
{
返回“删除失败!”;
}
}
else
{
返回“不存在或无法访问!”;
}
}
一些需要注意的事项
如有必要,您必须注意文件权限
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;
}
}
?>
samy dot see at gmail dot com
13 年前
如果您在Windows中测试您的网站时遇到“权限被拒绝”问题,也许这可以解决问题

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

然后

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

<?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);
}
}
?>
anonymous_user
3年前
// 递归PHP函数,完全删除目录

函数delete_directory_recursively( $path ) {

$dir = new \DirectoryIterator( $path );

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

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

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

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

// 且不为空(在这种情况下,scandir返回的数组不是2个(.和..)元素)
如果 ( 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() 函数定义结束
TrashF at taistelumarsu dot org
16 年前
如果您尝试使用rmdir() 并不断收到“权限被拒绝”错误,请确保在使用opendir() 后未打开该目录。尤其是在编写删除目录的递归函数时,请确保在rmdir() 之前已执行closedir()。
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);
}
?>
To Top