我这里有一段PHP代码,用于删除目录及其中的所有文件(如果存在)。 但是,我不太确定它,它在我看来它会删除所有子地图,然后删除那些文件等等......
我基本上想要给出和可选的true / false参数来选择是否删除子目录。或者更好的做法是制作2个功能?第一个完全清空文件夹,第二个删除文件夹及其中的所有内容。
以下是代码:
function delete_directory($dirname) {
if (is_dir($dirname)) {
$dir_handle = opendir($dirname);
if (!$dir_handle) return false;
while($file = readdir($dir_handle)) {
if ($file != "." && $file != "..") {
if (!is_dir($dirname."/".$file)){
@unlink($dirname."/".$file);
}else {
delete_directory($dirname.'/'.$file);
}
}
}
closedir($dir_handle);
}
@rmdir($dirname) or die("Could not remove directory.");
return true;
}
而我基本上想知道的是:这里可能出现什么问题? 是否存在这段代码严重搞砸的情况? 我已经用Netbeans对它进行了几个小时的调试,并尝试了很多不同的场景。现在我有点困惑,想知道StackoverFlow的人是否可以在代码中找到一个缺陷?
答案 0 :(得分:5)
而我基本上想知道的是:这里可能出现什么问题?是否存在这段代码严重搞砸的情况?
如果dir包含一个符号链接到其他地方,它会被跟踪(除非我弄错了 - 你应该检查一下)。这可能导致野火,你基本上消灭了整个文件系统。您可能希望使用realpath
答案 1 :(得分:3)
正如其他人所说:
if ($file != "." && $file != "..") {
应该是
if ($file != "." && $file != ".." && !is_link($file)) {
答案 2 :(得分:2)
即使参数是指向目录的符号链接,PHP is_dir也会返回true,这非常危险。所以只需在第一个if语句中添加一个!is_link测试就可以使它更加安全。
答案 3 :(得分:1)
我基本上想要给出和可选的true / false参数来选择是否删除子目录。
如果不删除子目录,则无法删除父目录(因为它必须先为空)。如果您构建了delete_directory函数,以便它有时只会删除一个目录,那么您就会在轨道上询问问题。
如果您需要删除目录及其子目录中的所有文件,那么我将为其创建一个函数,将其称为deleteDirectoryFiles()
或其他内容。然后deleteDirectory
函数可以调用它,然后只清理空目录。
答案 4 :(得分:1)
可能出现什么问题?很多年前我写了一个函数来做这样的事情(递归删除临时工作目录)。但是,开发过程中的一个错误导致它删除了我的整个源代码目录!在我知道源代码控制是什么以及我的备份已经过时之前很久,所以我不得不使用DOS Norton Utilities来尽力取消删除我的源代码。
始终非常仔细地测试这样的功能。
答案 5 :(得分:1)
我尝试使用此代码,但它遗漏了树中的文件并且无法删除目录。
我替换了
while($file = readdir($dir_handle))
与
while(false !== ($file = readdir($dir_handle)))
根据PHP recomendations并修复它。
我还使用了以下其他提到的内容:
if ($file != "." && $file != ".." && !is_link($file)) {
答案 6 :(得分:0)
如果你只想删除一定数量的关卡,我会提供一个可选的“关卡”参数,允许你限制你想要的深度级别。
另一个想法是拥有一个“filesonly”标志,允许你保留目录结构,但删除所有文件。