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)
* 循环删除目录
* 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)
相关文章推荐
- php 递归创建目录、递归删除非空目录、迭代创建目录
- 利用rmdir()函数实现PHP递归删除目录
- php 递归删除目录(文件夹)
- php递归删除非空文件夹
- 解决删除文件或文件夹时提示“找不到该项目 该项目不在***中,请确认该项目的位置,然后重试。……”
- PHP递归获取目录内容readDir,递归删除rmdir
- C++ 递归方式删除非空目录文件夹
- PHP递归获取目录内容readDir,递归删除rmdir
- 系统提示无法删除文件或文件夹的常用解决办法
- php将某个指定目录下的所有文件及文件夹删除
- Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte
- php递归创建和删除文件夹
- PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)
- C#追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件
- WIN7下删除文件夹时提示“找不到该项目”的解决办法
- 清除代码中的svn信息(递归删除.svn目录)
- win 7 删除了用户文件夹后出现的&quot;你已使用临时配置文件登录&quot;提示的解决方法
- 删除eclipse3.4的configuration目录导致eclipse无法启动的解决办法
- PHP中对于错误信息的提示配置及其含义和解决错误的方法
- PHP中删除文件夹中含有部分字串的文件的解决方法