Почему даже выполнять свои функции?
public function delete($path) {
$it = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($it as $file) {
if (in_array($file->getBasename(), array('.', '..'))) {
continue;
} elseif ($file->isDir()) {
rmdir($file->getPathname());
} elseif ($file->isFile() || $file->isLink()) {
unlink($file->getPathname());
}
}
rmdir($path);
}
Это работает, потому что RII::CHILD_FIRST
перебирает дочерние элементы перед родительским элементом. Таким образом, к тому времени, когда он достигает каталога, он должен быть пустым.
Но настоящая ошибка связана с тем, где вы удаляете свои каталоги. Во внутренних каталогах вы делаете это в родительской итерации. Это означает, что ваш корневой каталог никогда не будет удален. Я бы предложил сделать это в локальной итерации удаления:
public function delete($path) {
if(!file_exists($path)) {
throw new RecursiveDirectoryException('Directory doesn\'t exist.');
}
$directoryIterator = new DirectoryIterator($path);
foreach($directoryIterator as $fileInfo) {
$filePath = $fileInfo->getPathname();
if(!$fileInfo->isDot()) {
if($fileInfo->isFile()) {
unlink($filePath);
} elseif($fileInfo->isDir()) {
if($this->emptyDirectory($filePath)) {
rmdir($filePath);
} else {
$this->delete($filePath);
}
}
}
}
rmdir($path);
}
Обратите внимание на два изменения. Мы удаляем только пустые каталоги внутри итерации. Вызов $this->delete()
для этого обработает удаление для вас. Второе изменение - это добавление окончательного rmdir
в конце метода ...