PHP递归文件&文件夹删除功能:“目录不为空”错误信息

发布于 2024-12-08 12:49:25 字数 884 浏览 0 评论 0原文

我正在尝试创建一个函数,该函数删除虚拟主机上的所有文件和目录,不包括给定的文件和文件夹数组

function cleanUp($exdirs, $exfiles){
$it = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator('.'), 
  RecursiveIteratorIterator::CHILD_FIRST
);
foreach($it as $entry) {
  if ($entry->isDir() && !in_array($entry->getBasename(), $exdirs)) {
    rmdir($entry->getPathname());
  }
  else {
    if (!in_array($entry->getFileName(), $exfiles)) {
      unlink($entry->getPathname());
    }
    else {
      $exdirs[] = dirname($entry->getFileName());
    }
  }
}
}

并像这样调用此函数

$excludeDirsNames = array('cgi-bin');
$excludeFileNames = array('.htaccess', 'ws.zip', 'update.php');
cleanUp($excludeDirsNames , $excludeFileNames);

现在的问题是,它删除但收到错误消息:Directory not empty on line rmdir($ Entry->getPathname()); 多次。如何解决这个问题?

I'm trying to create function which removes all file and directories on webhosting excluding given files and folders arrays

function cleanUp($exdirs, $exfiles){
$it = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator('.'), 
  RecursiveIteratorIterator::CHILD_FIRST
);
foreach($it as $entry) {
  if ($entry->isDir() && !in_array($entry->getBasename(), $exdirs)) {
    rmdir($entry->getPathname());
  }
  else {
    if (!in_array($entry->getFileName(), $exfiles)) {
      unlink($entry->getPathname());
    }
    else {
      $exdirs[] = dirname($entry->getFileName());
    }
  }
}
}

And calling this function like this

$excludeDirsNames = array('cgi-bin');
$excludeFileNames = array('.htaccess', 'ws.zip', 'update.php');
cleanUp($excludeDirsNames , $excludeFileNames);

Now the problem is, it deletes but getting error message: Directory not empty on line rmdir($entry->getPathname()); several times. How to fix that problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幽蝶幻影 2024-12-15 12:49:25

您允许排除文件和目录,但不测试目录是否包含之前排除的其他文件或目录。

if (substr($oneExcludedFileOrDirectory, 0, strlen($currentDir) === $currentDir) {
  echo "Directory not empty";
}

只是一个简单的前缀比较:“dir”是排除路径之一的前缀吗?仅适用于绝对路径(以及其他一些小事情),但它应该解释这是怎么回事。

You allow to exclude files and directories, but you don't test, if a directory contains other files, or directories, that were excluded before.

if (substr($oneExcludedFileOrDirectory, 0, strlen($currentDir) === $currentDir) {
  echo "Directory not empty";
}

Just a simple prefix comparison: Is "dir" is prefix of one of the excluded paths? Only works for absolute paths (and some other minor things), but it should explain, whats the matter.

心如荒岛 2024-12-15 12:49:25

以下是它不起作用的两个原因:

1)在您的子文件夹之一中有您排除的文件。由于没有删除,因此无法“rm”该文件夹。

2) 在“unlink”和“rmdir”-Funktion 调用“clearstatcache();”之后。我想这会解决你的问题。文件已删除,但信息在缓存中仍然可用。

Here are two reasons why it not work:

1) In one of your child-folder are files you are excluding. There are not deleted, so it is not possible to "rm" the folder.

2) After the "unlink" and "rmdir"-Funktion call "clearstatcache();". I think this will solve your problem. The files are delete, but the information is still available in the cache.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文