一段PHP代码我不太确定

时间:2008-12-21 23:14:45

标签: php

我这里有一段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的人是否可以在代码中找到一个缺陷?

7 个答案:

答案 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”标志,允许你保留目录结构,但删除所有文件。