2

我正在使用 php 删除包含已删除帖子图像的文件夹。我正在使用我在网上找到的下面的代码并且做得很好。

我想知道当文件夹中有其他文件夹时,如何仅删除文件夹中的特定文件夹。

当我使用下面的代码时,怎么可能做到这一点?使用:/dev/images/norman/8 -> 不会删除文件夹 8 使用:/dev/images/norman/ -> 将删除所有文件夹

Eg:
/dev/images/norman/8 -> I need to delete only this folder
/dev/images/norman/9
/dev/images/norman/10
/dev/images/norman/11
/dev/images/norman/12

<?php
$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/8';

emptyDir($path);

function emptyDir($path) { 

    // INITIALIZE THE DEBUG STRING
    $debugStr  = '';
    $debugStr .= "Deleting Contents Of: $path<br /><br />";

    // PARSE THE FOLDER
    if ($handle = opendir($path)) {

        while (false !== ($file = readdir($handle))) {

            if ($file != "." && $file != "..") {

                // IF IT"S A FILE THEN DELETE IT
                if(is_file($path."/".$file)) {

                    if(unlink($path."/".$file)) {
                    $debugStr .= "Deleted File: ".$file."<br />";   
                    }

                } else {

                    // IT IS A DIRECTORY
                    // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS

                    if($handle2 = opendir($path."/".$file)) {

                        while (false !== ($file2 = readdir($handle2))) {

                            if ($file2 != "." && $file2 != "..") {
                                if(unlink($path."/".$file."/".$file2)) {
                                $debugStr .= "Deleted File: $file/$file2<br />";    
                                }
                            }

                        }

                    }

                    if(rmdir($path."/".$file)) {
                    $debugStr .= "Directory: ".$file."<br />";  
                    }

                }

            }

        }

    }
    echo $debugStr;
}

?>
4

5 回答 5

5
<?php

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);
   return true;
 }
?>

如果您使用的是 5.1 及更高版本,

<?php
function deleteDir($dir) {
   $iterator = new RecursiveDirectoryIterator($dir);
   foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) 
   {
      if ($file->isDir()) {
         rmdir($file->getPathname());
      } else {
         unlink($file->getPathname());
      }
   }
   rmdir($dir);
}

deleteDir("temporary");
?>
于 2012-09-27T12:57:29.790 回答
2

你想听听rmdir

if(is_file($path."/".$file)) {

    if(unlink($path."/".$file)) {
    $debugStr .= "Deleted File: ".$file."<br />";   
    }

} else {

    if(rmdir($path."/".$file)) {
        $debugStr .= "Deleted Directory: ".$file."<br />";   
    }

}

编辑:由于rmdir只能处理空目录,您可以使用 rmdir 页面评论中报告的此解决方案:

function rrmdir($dir) {
    foreach(glob($dir . '/*') as $file) {
        if(is_dir($file))
            rrmdir($file);
        else
            unlink($file);
    }
    rmdir($dir);
}

它只是递归地删除 中的所有内容$dir,然后摆脱目录本身。

于 2012-09-27T12:51:14.943 回答
0
$path='./ggg';
rrmdir($path);
function rrmdir($dir) {
if (is_dir($dir)) {
 $objects = scandir($dir);
 foreach ($objects as $object) {
   if ($object != "." && $object != "..") {
     if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
   }
 }
 reset($objects);
 rmdir($dir);
}
}
于 2012-09-27T13:35:33.797 回答
0

您可以使用系统命令 ex。exec("rm -rf {$dirPath}");或者如果你想用 PHP 来做,你必须递归,循环不会做对。

public function deleteDir($path) {

    if ($handle = opendir($path)) {

        while (false !== ($file = readdir($handle))) {

            if ($file != "." && $file != "..") {

                // IF IT"S A FILE THEN DELETE IT
                if(is_file($path."/".$file)) {

                    if(unlink($path."/".$file)) {
                        $debugStr .= "Deleted File: ".$file."<br />";
                    }

                } else {
                    deleteDir($path."/".$file."/");
                    rmdir($path."/".$file);
                }
            }
        }
    }
}

当我使用下面的代码时,怎么可能做到这一点?使用:/dev/images/norman/8 -> 不会删除文件夹 8 使用:/dev/images/norman/ -> 将删除所有文件夹

我认为您的问题是您在“/dev/images/norman/8”的末尾缺少“/”

于 2012-09-27T12:55:52.070 回答
0

$exclude在您的函数中添加了一个参数,该参数是一个数组,其中包含您要排除的目录名称,如下所示:

$path = $_SERVER['DOCUMENT_ROOT'].'/dev/images/norman/';

emptyDir($path); //will delete all under /norman/
emptyDir($path, array('8')); //will delete all under /norman/ except dir 8
emptyDir($path, array('8','10')); //will delete all under /norman/ except dir 8 and 10

function emptyDir($path,$exclude=false) { 

    // INITIALIZE THE DEBUG STRING
    $debugStr  = '';
    $debugStr .= "Deleting Contents Of: $path<br /><br />";
    if (!$exclude) {
       $exclude = array();
    }

    // PARSE THE FOLDER
    if ($handle = opendir($path)) {

        while (false !== ($file = readdir($handle))) {

            if ($file != "." && $file != "..") {

                // IF IT"S A FILE THEN DELETE IT
                if(is_file($path."/".$file)) {

                    if(unlink($path."/".$file)) {
                    $debugStr .= "Deleted File: ".$file."<br />";   
                    }

                } else if (!in_array($file, $exclude)) {

                    // IT IS A DIRECTORY
                    // CRAWL THROUGH THE DIRECTORY AND DELETE IT'S CONTENTS

                    if($handle2 = opendir($path."/".$file)) {

                        while (false !== ($file2 = readdir($handle2))) {

                            if ($file2 != "." && $file2 != "..") {
                                if(unlink($path."/".$file."/".$file2)) {
                                $debugStr .= "Deleted File: $file/$file2<br />";    
                                }
                            }

                        }

                    }

                    if(rmdir($path."/".$file)) {
                    $debugStr .= "Directory: ".$file."<br />";  
                    }

                }

            }

        }

    }
    echo $debugStr;
}
于 2012-09-27T13:01:00.303 回答