代码之家  ›  专栏  ›  技术社区  ›  Dan Hanly

PHP迭代并删除目录问题

  •  0
  • Dan Hanly  · 技术社区  · 14 年前

    我已经建立了一个系统,用户可以启动一个项目并将文件上传到这个项目。当他们创建项目时,我专门为该项目创建一个目录,所有上载都将填充这个目录。但是,我实现了一个系统,允许用户根据需要删除这个项目,删除目录中的所有文件,然后删除目录本身。

    在本地(在mamp上),这很有魅力;但是在一个实时服务器上,它却没有。对于目录删除,我使用了教程网站上的一段代码(发布在下面),正如我所说,在本地Web服务器上运行良好。

    $name = $_POST['projectName'];
    rrmdir("../../project/$name");
    
        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);
            echo "Directory Removed";
        }
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Gordon Haim Evgi    14 年前

    试试这个:

    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator('/path/to/project/directory'),
        RecursiveIteratorIterator::CHILD_FIRST);
    
    foreach($iterator as $fileObject) {
        if($fileObject->isFile()) {
            echo 'Removing File: ', $fileObject->getRealpath(), PHP_EOL;
            // unlink($fileObject->getRealpath());
        } elseif($fileObject->isDir()) {
            echo 'Removing Dir: ', $fileObject->getRealpath(), PHP_EOL;
            // rmdir($fileObject->getRealpath());
        }
    }
    

    取消评论 rmdir unlink 实际执行删除操作的行。

        2
  •  3
  •   Robin    14 年前

    非常 小心点:

    $name = $_POST['projectName'];
    rrmdir("../../project/$name");
    

    这就像是对服务器文件系统的SQL注入,想象一下如果有人在浏览器中输入: http://www.yoursite.com/this-script.php?projectName=../../../../var/www 你可能想看看 escapeshellarg() 帮助关闭这个巨大的安全漏洞 realpath() 将相对路径转换为绝对路径。如果目标目录不为空,那么rmdir将无法工作,您需要先删除所有子目录和文件,然后rmdir才能工作。

        3
  •  2
  •   Rob Olmos    14 年前

    注意到您使用了相对路径,请查看此注释是否有帮助: http://php.net/manual/en/function.unlink.php#85938