PHP改进此功能以删除文件夹及其所有内容添加空文件夹的大小写

时间:2013-12-18 17:26:59

标签: php

我在php.net中找到了这个我非常喜欢的功能,因为我理解它:D

但它有一个BUG,至少一次。

如果有空文件夹则失败! 有没有一个技巧来改进这个功能而不用太多改变它?

function rrmdir($dir) 
{

foreach(glob($dir . '/*' ) as $file) 
    {

        if( is_dir($file) )
            rrmdir($file);
        else

            unlink($file);
    }

rmdir($dir);
}

如果有一个空文件夹,则错误为:传递给foreach的无效参数。我认为问题是,如果发现一个空文件夹glob没有给出数组。所以foreach失败了。

原始错误:The original error

使用Philip G FUNCTION With Philip G FUNCTION

TIM函数Erro with TIM function

出错

2 个答案:

答案 0 :(得分:1)

编辑:newtphp:这是否是继续避免跳跃的好方法? (由OP建议,由我修改)

function rrmdir($dir) {
    $temp = scandir($dir);

    if (is_array($temp)) {
        $temp = array_diff($temp,array(".",".."));
        foreach($temp as $file) {   
            if( is_dir($dir."/".$file) )
                rrmdir($dir."/".$file);
            else
                unlink($dir."/".$file);
        }
    }
    rmdir($dir);
}

array_diff从第一个数组中删除第二个数组中的值。

<小时/> 原帖: 如果glob有错误,它将返回布尔false而不是数组。由于foreach需要一个数组,因此无法工作。试试这个:

function rrmdir($dir) {
    $temp= glob($dir . '/*' );
    if (is_array($temp))
        foreach($temp as $file) {
            if( is_dir($file) )
                rrmdir($file);
            else
                unlink($file);
        }
    rmdir($dir);
}

编辑以正确处理隐藏文件,请使用:

function rrmdir($dir) {
    $temp = scandir($dir);
    if (is_array($temp))
        foreach($temp as $file) {
            if($file=="." || $file=="..")
                continue;
            else if( is_dir($dir."/".$file) )
                rrmdir($dir."/".$file);
            else
                unlink($dir."/".$file);
        }
    rmdir($dir);
}

glob不同,scandir不会返回文件的整个路径,因此代码稍微复杂一些。

这不一定能解决所有问题。由于其他原因,它仍然可能失败。例如,如果用户没有写入权限。

答案 1 :(得分:1)

如果文件夹为空,Foreach希望获得一个数组。没有数组将返回,因此无效的参数。

试试这个:

function rrmdir($dir) 
{
    $files = array_diff(scandir($dir), array('.','..')); 

    if(is_array($files)){
        foreach($files as $file) 
        {

            if( is_dir($file) ){
                rrmdir($file);
            }
            else{
                unlink($file);
            }
        }
    }

   rmdir($dir);
}

修改 或者你可以试试这个:(虽然不会递归)

function rrmdir($dir) 
{
   array_map('unlink', glob($dir . '/*')); 
   rmdir($dir);
}