【问题标题】:Reclusive Directory Remove not working?Reclusive Directory Remove 不起作用?
【发布时间】:2023-03-27 18:15:02
【问题描述】:

我正在尝试使用此脚本删除一个目录及其所有内容...

<?php
$app = $_POST['app'];

if (isset($_POST['app'])) {
    $dir = "../apps/" . $app . "/";

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

$post 工作正常,脚本没有返回任何错误,只是没有删除目录。它可能与文件夹权限有关吗?我需要激活任何 PHP 扩展吗?

--编辑-- 链接的副本没有做我想要的,我不知道如何更改它的代码。我正在删除客户端的一个目录,所以我不能使用__DIR__,因为它会保留这样的路径 /test/app 并且我需要它们像这样 \test\app 代码也不会删除文件夹但是它确实删除了所有内容。我相信这与FilesystemIterator::SKIP_DOTS 行有关。我还需要代码来删除文件夹,因为当用户再次安装应用程序时,由于文件夹重复,它不会工作。

工作代码:

<?php
$app = $_POST['app'];

if (isset($_POST['app'])) {
$dir ="../apps/" . $app;

$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
    $file->isDir() ?  rmdir($file) : unlink($file);
}
rmdir($dir);
}
?>

【问题讨论】:

  • 您确实想在链接的欺骗中使用已接受的答案。它更容易使用。除此之外,您要确保路径确实位于“../apps/”文件夹下方。现在,恶意用户可以使用目录遍历攻击并传入“..”作为导致“../apps/../”的路径,我怀疑你是否希望发生这种情况。
  • 嗨@Gordon 感谢您的回复。您能否解释一下__DIR__ 在目录路径之前的含义或作用?我刚刚使用了那个代码,我的目录仍然没有被删除
  • 我不相信我的问题是重复的@Gordon,请你看看我更新的问题
  • 我不确定是否应该重新打开它。你能澄清你在客户端删除目录的意思吗? PHP 在服务器端运行。它无权访问客户端。斜线的方向也无关紧要,因为 PHP 将在内部为您的平台使用正确的格式。另外,您说它确实删除了内容,但只是没有删除顶级文件夹。这很容易解决,只需在迭代器完成删除所有内容后 rmdir'ing 路径。
  • 好吧,当我使用__DIR__ 时,我遇到了一个错误,它在两个方面都是错误的。首先,它没有考虑 .. 向上一层,因此路径从 php 文件所在的位置开始,其次,它开始的路径以错误的方式斜线到路径的其余部分。我假设迭代器应该在最后“rmdir”目录。我在迭代器的末尾添加了该行,现在一切正常。感谢你的帮助!我会把完整的代码放在我的问题中

标签: php directory scandir rmdir


【解决方案1】:

link@Gordon 发给我,帮我找到答案。

这是我的新工作代码。

<?php
$app = $_POST['app'];

if (isset($_POST['app'])) {
$dir ="../apps/" . $app;

$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
    $file->isDir() ?  rmdir($file) : unlink($file);
}
rmdir($dir);
}
?>

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2014-09-27
    • 2015-10-03
    • 2015-07-07
    • 2014-12-07
    • 2013-10-06
    相关资源
    最近更新 更多