Для целей этого ответа я оставлю риски безопасности, связанные с любыми загрузками в каталоге. Я знаю, что это небезопасно, но я чувствую, что эта проблема выходит за рамки исходного вопроса .
Как все говорили, это может быть проблема с разрешением. Но так как вы создали каталог в своем коде (который, скорее всего, запускается от имени того же пользователя при удалении). Это сомнение, что это так.
Чтобы удалить каталог, вам необходимо убедиться, что:
У вас есть соответствующие разрешения (как все указали).
Все дескрипторы каталога должны быть закрыты перед удалением .
(если оставить ручки открытыми, это может вызвать Отказано в разрешении ошибки)
Каталог должен быть пустым . rmdir()
удаляет только каталог, а не файлы внутри. Так что он не может делать свою работу, если внутри все еще есть что-то.
Чтобы исправить номер 2, это очень просто. Если вы используете что-то вроде этого:
$hd = opendir($mydir);
Закройте дескриптор перед удалением:
closedir($hd);
Для номера 3 то, что вы хотите сделать, называется рекурсивным удалением. Для этого вы можете использовать следующую функцию:
function force_rmdir($path) {
if (!file_exists($path)) return false;
if (is_file($path) || is_link($path)) {
return unlink($path);
}
if (is_dir($path)) {
$path = rtrim($path, DIR_SEPARATOR) . DIR_SEPARATOR;
$result = true;
$dir = new DirectoryIterator($path);
foreach ($dir as $file) {
if (!$file->isDot()) {
$result &= force_rmdir($path . $file->getFilename(), false, $sizeErased);
}
}
$result &= rmdir($path);
return $result;
}
}