我在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失败了。
原始错误:
使用Philip G FUNCTION
TIM函数
出错答案 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);
}