您的位置:首页 > 编程语言 > PHP开发

php的rmdir递归删除某种情况下目录信息刷新过慢而导致提示文件夹非空延时重试解决测试

2013-03-28 16:48 197 查看
/*
* 循环删除目录
* return:true 或 string错误, 请使用绝对真来判断是否成功
*/
function rmdir($path) {
$path = trim($path);
$path = str_replace("\\", '/', $path);
if (!file_exists($path)) return '路径不存在';
echo "<br/><br/>$path <br/>";
if (!is_dir($path)){
echo "unlink_____$path <br/>";
return $this->_unlink($path);
}

if ($handle = opendir($path)) {
echo $handle.'_____<br/>';
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$t = $path.'/'.$file;
echo "for_____ {$t}<br/>";
if (is_dir($t)) {//目录
if (true !== ($re = $this->rmdir($t))) return $re;
} else {//文件
if (!$this->_unlink($t)){
echo "del___error_____ {$t}<br/>";
return 0;
}else echo "delele___{$t}<br/>";
}
}
}

closedir($handle);echo $handle.'_____<br/>';
echo "end_rmdir______{$path}__________<br/><br/>";
return $this->_rmdir($path);
}

return false;
}
/*
* 增加失败后延时重试功能的删除文件方法
*/
private function _unlink($path) {
if (!unlink($path)) {
sleep(2);
return unlink($path);
}

return true;
}
/*
* 增加失败后延时重试功能的删除文件方法
*/
private function _rmdir($path) {
if (!rmdir($path)) {
sleep(2);
return rmdir($path);
}

return true;
}

在上面的这个方法中,经过调试发现:
在windows下面建立了很多级的目录之后,且打开文件管理器当前位置处于被删除目录中之一,
如果没有加:sleep(1);//防止下面的删除目录命令执行过快:如window的文件管理器刚好处于被删除目录之下
这个延时执行语句,我猜测应该是在删除完下面的子对象后,文件管理器的原因或是其它原因,导致路径信息刷新过慢,
rmdir方法在未等待路径信息刷新之前就运行了,而出现文件夹非空的提示.
但是加了延时导致目录级别过大时,就非常慢,因为每个目录停留1秒,如果要删除100个,那么就导致整个过程至少需要100秒,
所以,这也不是很好解决方案.

-------------
文件管理器正打开着G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd的测试结果,从结果中可以看出它一直往上级退时造成的非空延时假像.

G:/www/edm/system/../application/cache/1
........................

G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd
Resource id #91_____
for_____ G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/Adobe Photoshop Image.psd
delele___G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/Adobe Photoshop Image.psd
for_____ G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/dAdobe Photoshop Image.psd
delele___G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/dAdobe Photoshop Image.psd
for_____ G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/ffefefe

G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/ffefefe
Resource id #92_____
Resource id #92_____
end_rmdir______G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd/ffefefe__________

Resource id #91_____
end_rmdir______G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd__________

A PHP Error was encounteredSeverity: Warning
Message: rmdir(G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe/ddddd): Directory not empty
Filename: libraries/file.php
Line Number: 82
Resource id #90_____
end_rmdir______G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe__________

A PHP Error was encounteredSeverity: Warning
Message: rmdir(G:/www/edm/system/../application/cache/1/ffefefe/ddddd/ffefefe): Directory not empty
Filename: libraries/file.php
Line Number: 82
Resource id #89_____
end_rmdir______G:/www/edm/system/../application/cache/1/ffefefe/ddddd__________

A PHP Error was encounteredSeverity: Warning
Message: rmdir(G:/www/edm/system/../application/cache/1/ffefefe/ddddd): Directory not empty
Filename: libraries/file.php
Line Number: 82
Resource id #88_____
end_rmdir______G:/www/edm/system/../application/cache/1/ffefefe__________

A PHP Error was encounteredSeverity: Warning
Message: rmdir(G:/www/edm/system/../application/cache/1/ffefefe): Directory not empty
Filename: libraries/file.php
Line Number: 82
Resource id #37_____
end_rmdir______G:/www/edm/system/../application/cache/1__________

A PHP Error was encounteredSeverity: Warning
Message: rmdir(G:/www/edm/system/../application/cache/1): Directory not empty
Filename: libraries/file.php
Line Number: 82
bool(true)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: