从Linux目录中删除点文件的PHP脚本

3

我一直在处理一个项目,其中有一步需要脚本自动删除Linux上的某个目录(以及其所有内容)。

我目前使用以下代码来完成这个任务:

# Perform a recursive removal of the obsolete folder
$dir_to_erase = $_SESSION['path'];
function removeDirectory($dir_to_erase) {
    $files = glob($dir_to_erase . '/*');
    foreach ($files as $file) {
        is_dir($file) ? removeDirectory($file) : unlink($file);
    }
    rmdir($dir_to_erase);
    return; 
}

需要删除的文件夹是$_SESSION ['path']。一直很有效,但最近我不得不向该文件夹添加一个.htaccess文件,我发现脚本停止正确工作了(仍然可以成功删除其他文件,但无法删除.htaccess文件)。

有没有人能指点我应该在代码中添加什么来包括隐藏的点文件在删除过程中?


/* 不匹配以“.”开头的文件。在bash shell上尝试一下。我假设将您的脚本中的/*更改为/。在Linux系统上应该可以完成工作。虽然我从未使用过glob。 - Mathijs Segers
3个回答

2
简单地说,你可以依赖于 DirectoryIterator

DirectoryIterator 类提供了一个简单的接口来查看文件系统目录的内容。

function removeDirectory($dir_to_erase) {
    $files = new DirectoryIterator($dir_to_erase);
    foreach ($files as $file) {
        // check if not . or ..
        if (!$file->isDot()) {
            $file->isDir() ? removeDirectory($file->getPathname()) : unlink($file->getPathname());
        }
    }
    rmdir($dir_to_erase);
    return;
}

那里有很多功能,你可以利用它们,例如检查所有者,这非常有用,可以确保不删除关键文件。


@Peter 如果这个方法完美解决了问题,请颁发绿色勾选来避免新读者浪费时间在已解决的问题上或者阅读其他可能无效的答案。 - mickmackusa

1
你可以稍微修改一下你的函数,以便同时删除隐藏文件:
function removeDirectory($dir) 
{
    if (is_dir($dir)) { 
        $objects = scandir($dir); 
        foreach ($objects as $object) { 
            if ($object != "." && $object != "..") { 
                if (is_dir($dir."/".$object))
                    removeDirectory($dir."/".$object);
                else
                    unlink($dir."/".$object); 
            } 
        }
        rmdir($dir); 
    } 
}

嗯...看起来glob函数的参数太长了。这意味着您删除的某些文件/文件夹的路径超过4096个字符。 - PHPLego
这是因为现在的函数“深入”到了隐藏文件夹中。 - PHPLego
我该如何防止这种情况发生?意思是只包括像.htaccess这样的隐藏文件,并完全排除隐藏文件夹?此外,根本没有隐藏文件夹。 - Peter
问题出在特殊文件夹“.”和“..”中。我们需要将它们排除在外。我已经修改了这个函数。 - PHPLego
我又改了代码。scandir更适合这个目的。现在应该可以正常工作了。终于 :) - PHPLego
显示剩余6条评论

0

明白了。这是否意味着我需要将以下行进行更改:$files = glob($dir_to_erase . '/'); 改为 $files = glob($dir_to_erase . '/.');? - Peter
尝试过了,但是出现了一堆错误 - 现在什么都没有被删除:警告:glob():模式超过了4096个字符的最大允许长度,在/home/chalouco/public_html/hihi/main/cleanup.php的第20行警告:glob():模式超过了4096个字符的最大允许长度,在/home/chalouco/public_html/hihi/main/cleanup.php的第21行警告:array_merge():参数#1不是数组,在/home/chalouco/public_html/hihi/main/cleanup.php的第22行警告:foreach()提供了无效的参数,在/home/chalouco/public_html/hihi/main/cleanup.php的第22行 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接