Во-первых, давайте уберем их:
chmod
с разрешениями до 0777 не предотвращает ошибку. Теперь, вот моя проблема. rmdir()
бросает эту ошибку при попытке удалить каталог:
rmdir (098f6bcd4621d373cade4e832627b4f6) [function.rmdir]: разрешение отклонено в пути \ to \ administratorate.php в строке 124
098f6bcd4621d373cade4e832627b4f6 – это имя каталога.
Вот соответствующая часть скрипта.
if(is_dir($userhash)) : foreach (new DirectoryIterator($userhash) as $fileInfo) { $fileName = $fileInfo->getFilename(); if($fileInfo->isDot()) continue; if(!rename($userhash.'/'.$fileName , 'trashcan/'.$username.'/'.$fileName)) { echo '<p class="error">Could not move '.$fileName.'</p>'; $err = 1; } } else : echo '<p class="error">Unable to delete files! error: 67</p>'; $err = 1; endif; //JUST TO BE SURE chmod('./',0777); chmod($userhash,0777); // RMDIR ONCE THE DIR IS EMPTY. if(rmdir($userhash)) echo '<p class="success">Deleted the user directory. The files are in the trash.</p>'; else { echo '<p class="error">Could not remove the user directory. Error: 656</p>'; $err = 1; }
Я вручную создал dir 'jake'
в том же каталоге. Я сделал rmdir('jake');
и он отлично поработал. Теперь я вручную создал '098f6bcd4621d373cade4e832627b4f6'
в том же каталоге. Я сделал rmdir('098f6bcd4621d373cade4e832627b4f6');
и это ошибка!
Это начинает выглядеть как какая-то странная ошибка rmdir()
, что маловероятно, как кажется. Вот имена каталогов, которые я создал, а затем попытались удалить с помощью rmdir
;
098f6bcd4621d373cade4e832627b4f6 | didn't work (quintuple checked) 098f6bcd4621d373cade4e832627b4f7 | worked 098f6bcd4621d373cade4e832627b4f | worked 098f6bcd4621d373cade4e832627b4f66 | worked
Чтобы удалить файл:
UPDATE: об ограниченном флаге удаления – от man chmod
:
ОГРАНИЧЕННЫЙ УДАЛЕННЫЙ ФЛАГ ИЛИ СТИЛЬНЫЙ БИТ
Флаг ограниченного удаления или липкий бит – это один бит, интерпретация которого зависит от типа файла. Для каталогов он запрещает непривилегированным пользователям удалять или переименовывать файл в каталоге, если только они не владеют файлом или каталогом; это называется флагом ограниченного удаления для каталога и обычно встречается в каталогах, доступных для записи в мире, таких как / tmp. Для обычных файлов в некоторых более старых системах бит сохраняет текстовое изображение программы на устройстве подкачки, поэтому он будет загружаться быстрее при запуске; это называется липким битом.
Вы можете установить его, добавив 1 к первой восьмеричной цифре в режиме, например:
chmod 1xxx dirname
ОБНОВЛЕНИЕ 2:
У пользователя, под которым выполняется php, есть разрешения для родительского каталога chmod?
Другими словами, вы уверены, что первый вызов chmod возвращает true?
chmod('./',0777);