1

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?

heron
  • 3,611
  • 25
  • 80
  • 148
  • Is this not here: http://stackoverflow.com/questions/7685134/php-recursive-delete-function. As you are experiencing an issue with the previous answer, I would sugest you go back to that thread, deselect the answer you approved and ask questions there. If the answer you chose does not work, you should revert your choice so as to not confuse future users how look at the thread. – SW4 Oct 07 '11 at 09:49
  • he gave me base idea. i can't deselect – heron Oct 07 '11 at 09:50
  • i mean i don't want to deselect. He gave me main idea – heron Oct 07 '11 at 09:52

2 Answers2

1

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.

KingCrunch
  • 128,817
  • 21
  • 151
  • 173
0

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.

fischel
  • 11
  • 1