【问题标题】:How to delete a folder with contents using PHP [duplicate]如何使用PHP删除包含内容的文件夹[重复]
【发布时间】:2010-11-22 23:50:38
【问题描述】:

我需要使用 PHP 删除包含内容的文件夹。 rmdir()unlink() 删除空文件夹,但不能删除有内容的文件夹。

【问题讨论】:

  • @@Maerlyn:我已于 2009 年 8 月 26 日发布了此问题。您提到的重复问题已于 2010 年 7 月 28 日发布。我相信您现在知道该怎么做……在做之前请交叉检查一次。

标签: php file filesystems directory


【解决方案1】:

此功能将允许您删除任何文件夹(只要它是可写的)及其文件和子目录。

function Delete($path)
{
    if (is_dir($path) === true)
    {
        $files = array_diff(scandir($path), array('.', '..'));

        foreach ($files as $file)
        {
            Delete(realpath($path) . '/' . $file);
        }

        return rmdir($path);
    }

    else if (is_file($path) === true)
    {
        return unlink($path);
    }

    return false;
}

或者不用递归使用RecursiveDirectoryIterator:

function Delete($path)
{
    if (is_dir($path) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);

        foreach ($files as $file)
        {
            if (in_array($file->getBasename(), array('.', '..')) !== true)
            {
                if ($file->isDir() === true)
                {
                    rmdir($file->getPathName());
                }

                else if (($file->isFile() === true) || ($file->isLink() === true))
                {
                    unlink($file->getPathname());
                }
            }
        }

        return rmdir($path);
    }

    else if ((is_file($path) === true) || (is_link($path) === true))
    {
        return unlink($path);
    }

    return false;
}

【讨论】:

  • 好方法,伙计。我使用的是非常简单的命令: ,但不幸的是有些服务器不允许系统命令,所以你的(我选择了第一个)是一个非常好的和简单的替代。谢谢兄弟。
  • 这也适用于相对路径吗?所以假设完整路径是“/var/www/html/folder_and_files_to_delete/”,删除脚本放在“/var/www/html/delete_folders_and_files.php”中。我可以将“folder_and_files_to_delete”作为路径吗?
  • 赞,最佳答案?
【解决方案2】:

这里有一个脚本可以满足您的需要:

/**
 * Recursively delete a directory
 *
 * @param string $dir Directory name
 * @param boolean $deleteRootToo Delete specified top-level directory as well
 */
function unlinkRecursive($dir, $deleteRootToo)
{
    if(!$dh = @opendir($dir))
    {
        return;
    }
    while (false !== ($obj = readdir($dh)))
    {
        if($obj == '.' || $obj == '..')
        {
            continue;
        }

        if (!@unlink($dir . '/' . $obj))
        {
            unlinkRecursive($dir.'/'.$obj, true);
        }
    }

    closedir($dh);

    if ($deleteRootToo)
    {
        @rmdir($dir);
    }

    return;
}

我从 php.net 得到它,它可以工作。

【讨论】:

    【解决方案3】:

    PHP 中没有一个函数可以实现这一点,您必须使用 rmdir 和 unlink 编写自己的函数。

    一个例子(取自php.net docs的评论):

    <?
    // ensure $dir ends with a slash
    function delTree($dir) {
        $files = glob( $dir . '*', GLOB_MARK );
        foreach( $files as $file ){
            if( substr( $file, -1 ) == '/' )
                delTree( $file );
            else
                unlink( $file );
        }
        rmdir( $dir );
    }
    ?>
    

    【讨论】:

    • @Randell: GLOB_MARK - 在返回的每个目录中添加一个斜杠。
    【解决方案4】:

    您将不得不递归删除所有文件。 rmdir 手册页的 cmets 中有很多示例函数:

    http://www.php.net/rmdir

    【讨论】:

    • 我希望 rmdir 只删除没有内容的文件夹。如果它有内容,它不会删除该文件夹。
    【解决方案5】:

    你总是可以作弊并做 shell_exec("rm -rf /path/to/folder");

    【讨论】:

    • 完全不推荐用于生产。
    • @Volomike:为什么?这几乎肯定比 php 解决方案快。
    • PHP 有更好的处理能力——它会检测过程中是否出现问题。另外,大多数共享主机提供商会阻止来自 PHP 的 shell 命令。第三,它不能移植到 Windows。而且我绝对不会编写包含此类内容的软件进行销售。
    • 这是 Volomike 的一个有争议的观点。如果您在 linux 环境中并且可以控制自己的命运,则此命令是此处的最佳选择,我肯定会选择此命令而不是使用户等待几秒钟的选项。
    【解决方案6】:

    您需要遍历文件夹内容(包括任何子文件夹的内容)并先将其删除。

    这里有一个例子:http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

    小心点!!!

    【讨论】:

    • 可能有人在这里试图将他们的答案提高到最高水平。 +1 抵消。
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 2013-03-20
    • 2016-11-07
    • 2018-01-25
    • 2021-08-16
    • 2013-03-15
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多