考虑以下代码:
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在任何子目录上失败,那么该目录将留下一些内容。
我希望删除所有内容,或删除任何内容。我正在考虑在删除之前复制目录,如果有任何失败,则恢复副本。但也许有更好的方法 - 比如锁定文件或类似的东西?
答案 0 :(得分:1)
我一般我会确认评论:
“复制它,删除它,如果删除则复制,否则丢弃删除消息失败......” - We0
但是让我们考虑一些方面:
尝试实现事务保存文件删除表示您希望在同一组文件上允许竞争文件锁定。事务处理通常是确保一致性的最“昂贵”方式。即使php有任何类型的testdelete可用也是如此,因为你需要在第一次运行时测试删除所有内容,然后再进行第二次循环,这会花费时间(并且你有危险在你的文件系统中发生了一些变化)与此同时)。还有其他选择:
是的,让我说我的理由不够可怕:) - 并且你实现了一个事务保存文件删除 - 你的例程可以这样实现:
这只是文件级别的事务保存。它不处理某人在步骤5和6之间更改文件夹权限的情况。
答案 1 :(得分:0)
或者您可以尝试将目录重命名/移动到类似/ tmp /的内容,它成功或不成功 - 但文件没有消失。即使另一个进程有一个打开的句柄,移动也应该没问题。