【问题标题】:PHP script to remove dot files from Linux directory用于从 Linux 目录中删除点文件的 PHP 脚本
【发布时间】:2017-03-17 07:50:21
【问题描述】:

我一直在做一个项目,其中涉及一个步骤,在此期间脚本需要自动删除 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。

标签: php file erase


【解决方案1】:

简单地说,你可以依赖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 如果这就像一个魅力,请给它绿色的勾号,这样新读者就不会来尝试解决已经解决的问题,也不会浪费时间阅读其他可能或可能不起作用。
【解决方案2】:

你也可以稍微修改你的函数来删除隐藏文件:

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():Pattern 超过了 /home/chalouco/public_html/hihi/main/cleanup.php 第 20 行中允许的 4096 个字符的最大长度警告:glob():Pattern 超出了第 21 行 /home/chalouco/public_html/hihi/main/cleanup.php 中的最大允许长度为 4096 个字符 警告:array_merge():参数 #1 不是 /home/chalouco/public_html/hihi/main/cleanup 中的数组第 22 行的 .php 警告:在第 22 行的 /home/chalouco/public_html/hihi/main/cleanup.php 中为 foreach() 提供的参数无效
  • hmm... 看起来 glob 函数将太长的字符串作为参数。这意味着您删除的某些文件/文件夹的路径长度超过 4096 个字符
  • 该功能在没有最近添加的情况下工作得很好 - 没有一个文件夹和文件有这么长的路径。在我添加新代码后才开始发生。
  • 我碰巧是因为现在功能“潜入”隐藏文件夹也
【解决方案3】:

根据这个答案:

PHP glob() doesnt find .htaccess

glob(".*") 会找到.htaccess

【讨论】:

  • 明白。这是否意味着我必须更改行: $files = glob($dir_to_erase . '/*');到 $files = glob($dir_to_erase . '/.*'); ?
  • 试过了,我得到了一堆错误 - 现在什么都没有被删除:警告:glob():模式超过 /home/chalouco/public_html/hihi/main 中 4096 个字符的最大允许长度第 20 行的 /cleanup.php 警告:glob():模式超过第 21 行 /home/chalouco/public_html/hihi/main/cleanup.php 中 4096 个字符的最大允许长度警告:array_merge():参数 #1 是不是第 22 行 /home/chalouco/public_html/hihi/main/cleanup.php 中的数组警告:第 22 行 /home/chalouco/public_html/hihi/main/cleanup.php 中的 foreach() 提供的参数无效跨度>
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2019-07-03
  • 1970-01-01
  • 2016-11-18
  • 2012-05-14
相关资源
最近更新 更多