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

时间:2011-10-07 09:43:54

标签: php recursion rmdir

我正在尝试创建删除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());。如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您允许排除文件和目录,但如果目录包含以前排除的其他文件或目录,则不进行测试。

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

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

答案 1 :(得分:0)

以下是导致其失效的两个原因:

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

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