考虑以下代码:
public static function removeDir($src)
{
if (is_dir($src)) {
$dir = @opendir($src);
if ($dir === false)
return;
while(($file = readdir($dir)) !== false) {
if ($file != '.' && $file != '..') {
$path = $src . DIRECTORY_SEPARATOR . $file;
if (is_dir($path)) {
self::removeDir($path);
} else {
@unlink($path);
}
}
}
closedir($dir);
@rmdir($src);
}
}
这将删除一个目录。但如果unlink在任何子目录上失败或opendir失败,则该目录将保留一些内容。
我希望要么全部删除,要么什么也不删除。我考虑在删除前复制目录,如果出现任何问题,就恢复副本。但也许有更好的方法,比如锁定文件或类似的东西?
flock()
来锁定文件,但是没有办法检查文件/目录是否可以被删除,除非实际删除它。不过,你可以事先检查chmod权限,或者使用is_writable()
或类似的方法来检查是否可写。 - Ben Fortunefileperms()
来完成... - Boldewyn