Проблема с удалением каталога и файлов

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

Ошибка, которую я получаю, -

Неустранимая ошибка PHP: необработанное исключение «UnexpectedValueException» с сообщением «RecursiveDirectoryIterator::__construct(http://[email protected]/): не удалось открыть каталог: не реализовано в

И вот раздел кода, к которому это относится -

$dir = 'http://www.thisismylink.co.uk/userfolder/' . $row['email'] . "/";
    $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
    $files = new RecursiveIteratorIterator($it,
                RecursiveIteratorIterator::CHILD_FIRST);
    foreach($files as $file) {
        if ($file->isDir()){
            rmdir($file->getRealPath());
        } else {
            unlink($file->getRealPath());
        }
    }
    rmdir($dir);

Сейчас в настоящее время структура -

Электронная почта пользователя ($dir)

  • pictures
    • picture.png
  • videos
    • video.mp4

Что я хочу сделать, так это удалить все внутри каталога «Пользовательская электронная почта», а также сам «Каталог пользователя».


person AshleyW    schedule 01.03.2015    source источник


Ответы (2)


Похоже, вы используете полный URL-адрес в качестве верхнего каталога. Разве не должно быть:

$dir = 'userfolder/' . $row['email'] . "/"; //Relative to your script
$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it,
            RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
    if ($file->isDir()){
        rmdir($file->getRealPath());
    } else {
        unlink($file->getRealPath());
    }
}
rmdir($dir);
person MegaAppBear    schedule 01.03.2015

Это действительно довольно опасный способ решения проблемы; Я не пытаюсь обойти ваш фактический вопрос, однако, пожалуйста, рассмотрите возможность хранения базы данных, полной «каталогов» и того, с кем они связаны. Когда вы удаляете пользователя, установите флаг в db на «toBeRemoved» или что-то в этом роде.

Затем время от времени запускайте cron/запланированное задание и запрашивайте список каталогов для удаления, а затем удаляйте запись в базе данных/отмечайте ее как обновленную.

Проблема в том, что независимо от того, насколько безопасным вы его считаете, сценарий может быть использован или привести к непредсказуемым результатам из веб-ввода или пользовательского ввода.

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

person Patrick Webster    schedule 01.03.2015