PHP递归文件&;文件夹删除功能:';目录不为空';错误消息

PHP递归文件&;文件夹删除功能:';目录不为空';错误消息,php,recursion,rmdir,Php,Recursion,Rmdir,我正在尝试创建一个函数,该函数删除webhosting上的所有文件和目录,不包括给定的文件和文件夹数组 function cleanUp($exdirs, $exfiles){ $it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('.'), RecursiveIteratorIterator::CHILD_FIRST ); foreach($it as $entry) { if ($entry-&g

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

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())多次。如何解决该问题?

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

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

只是一个简单的前缀比较:“dir”是被排除路径之一的前缀吗?仅适用于绝对路径(以及其他一些次要内容),但它应该解释问题所在。

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

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

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

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

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


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

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

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


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

这里不是吗:。由于您在上一个答案中遇到问题,我建议您返回该线程,取消选择您批准的答案并在那里提问。如果你选择的答案不起作用,你应该恢复你的选择,以免混淆未来用户对线程的看法。我不能取消我的意思是我不想取消选择。他给了我主要的想法这不在这里。由于您在上一个答案中遇到问题,我建议您返回该线程,取消选择您批准的答案并在那里提问。如果你选择的答案不起作用,你应该恢复你的选择,以免混淆未来用户对线程的看法。我不能取消我的意思是我不想取消选择。他给了我主要的想法,但我不明白。如果
/path/to/my/file
/path/to
开头,那么
/path/to/my/file
/path/to/
中,当您不删除
/path/to/my/file
时,那么
/path/to
就不是空的。更好吗?现在您应该可以自己将其集成到代码中了。它需要在foreach循环中?我真的无法将其集成到我的代码中。请告诉我它一定在哪里,我拿不到。如果
/path/to/my/file
/path/to
开头,那么
/path/to/my/file
/path/to/
中,当您不删除
/path/to/my/file
时,那么
/path/to
就不是空的。更好吗?现在您应该可以自己将其集成到代码中了。它需要在foreach循环中?我真的无法将其集成到我的代码中。请告诉我它一定在哪里