PHP рекурсивная функция удаления файлов и папок: сообщение об ошибке «Каталог не пустой» - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь создать функцию, которая удаляет все файлы и каталоги на веб-хостинге, за исключением заданных массивов файлов и папок

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 ]

1 голос
/ 07 октября 2011

Вы разрешаете исключать файлы и каталоги, но не проверяете, если каталог содержит другие файлы или каталоги, которые были исключены ранее.

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

Простопростое сравнение префиксов: является ли "dir" префиксом одного из исключенных путей?Работает только для абсолютных путей (и некоторых других незначительных вещей), но это должно объяснить, в чем дело.

0 голосов
/ 07 октября 2011

Вот две причины, почему это не работает:

1) В одной из ваших дочерних папок находятся файлы, которые вы исключаете. Там не удаляются, поэтому невозможно «рм» папку.

2) После "unlink" и "rmdir" -функция вызова "clearstatcache ();". Я думаю, что это решит вашу проблему. Файлы удаляются, но информация все еще доступна в кеше.

...