Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117

Как удалить директорию со всем ее содержимым?

24.08.2025, 23:18. Показов 1795. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые специалисты.

Скажем, есть директория us/mess. Если я знаю, что в ней есть только файлы, и мне нужно удалить ее, то я использую следующий код:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
       
        // удаляю сначала все файлы в этой директории
    $mess = opendir("us/mess");
    while(($e = readdir($mess)) != false) {
 
        if ($e == "." || $e == ".." ) continue;
        unlink("us/mess/$e");
    }
    closedir($mess);
 
       // и после удаляю саму директорию
      rmdir("us/mess");
Но, если в этой директории есть еще кроме файлов и еще другие вложенные директории, и файлы, и количество и название всего что там есть, мне неизвестно, то как правильно удалить целиком директорию us/mess со всем ее содержимым?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2025, 23:18
Ответы с готовыми решениями:

Как удалить теги со всем содержимым из кода?
как удалить теги <iframe> и <object> и все что между ними с кода? Пример: <body> <table...

Удаление директории со всем содержимым.
Такой команды в пхп нет. Однако использовать exec('..'); не хочется -- получается...

Копирование папки со всем содержимым
Привет! Можете дать пример функции которая скопирует папку в ту же директорию со всем содержимым с...

15
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
25.08.2025, 06:21
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function removeDirectory($dir)
{
    if (!is_dir($dir)) {
        return;
    }
 
    if (!($handle = opendir($dir))) {
        return;
    }
 
    while (($file = readdir($handle)) !== false) {
        if ($file === '.' || $file === '..') {
            continue;
        }
        $path = $dir . DIRECTORY_SEPARATOR . $file;
        if (is_dir($path)) {
            removeDirectory($path);
        } else {
            unlink($path);
        }
    }
    closedir($handle);
}
1
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
26.08.2025, 09:41
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function deleteDirectory($dir) {
    if (!is_dir($dir)) {
        // Если это не директория, можно попытаться удалить как файл
        if (file_exists($dir)) {
            unlink($dir);
        }
        return;
    }
 
    // Открываем директорию
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
 
        $path = $dir . DIRECTORY_SEPARATOR . $item;
 
        if (is_dir($path)) {
            // Рекурсивно удаляем вложенную директорию
            deleteDirectory($path);
        } else {
            // Удаляем файл
            unlink($path);
        }
    }
 
    // После удаления всех содержимых удаляем саму директорию
    rmdir($dir);
}
1
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117
05.09.2025, 20:03  [ТС]
long399, andrey_f, спасибо вам за ваши ответы. Извиняюсь за долгое молчание. Возвращаюсь к вопросу. Я не совсем понимаю вот что: как правильно запустить функцию?

Запускаю:
removeDirectory();
или
deleteDirectory();

но получаю ошибки. И без разницы, где размещается код функции, при любом месте размещения получаю ошибки.

Эта функция у меня должна выполняться при GET-запросе:

PHP
1
2
3
4
5
6
7
if (isset($_GET['del']) {
 
// здесь идет некий код, который удаляет всякое разное
 
// ну и здесь должна отрабатывать эта функция
 
}
Пожалуйста, пните меня в правильном направлении)
0
Эксперт PHP
 Аватар для liris
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
05.09.2025, 20:19
Сначала код функции (ее можно вынести даже в отдельный файл, который подключать через include или require), потом в вашем коде вызываете там, где она нужна.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function removeDirectory($dir)
{
    if (!is_dir($dir)) {
        return;
    }
 
    if (!($handle = opendir($dir))) {
        return;
    }
 
    while (($file = readdir($handle)) !== false) {
        if ($file === '.' || $file === '..') {
            continue;
        }
        $path = $dir . DIRECTORY_SEPARATOR . $file;
        if (is_dir($path)) {
            removeDirectory($path);
        } else {
            unlink($path);
        }
    }
    closedir($handle);
}
 
if (isset($_GET['del']) {
 
// здесь идет некий код, который удаляет всякое разное
 
// ну и здесь должна отрабатывать эта функция
$dirName = '/var/www/html/testDir'; // путь к вашей директории
removeDirectory($dirName);             // вызов функции, не забывая в нее передать директорию, которую надо удалить
 
}
1
1 / 1 / 0
Регистрация: 06.03.2024
Сообщений: 117
05.09.2025, 22:56  [ТС]
Ах да, увидел свои ошибки. Скорее даже больше невнимательность.

liris, спасибо вам за ваш ответ!
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
25.09.2025, 12:39
Есть и проще вариант (для linux):
PHP
1
system("rm -rf my_dir");
1
3055 / 1455 / 264
Регистрация: 16.03.2008
Сообщений: 6,490
Записей в блоге: 2
25.09.2025, 22:48
Цитата Сообщение от cia Посмотреть сообщение
Есть и проще вариант (для linux):
Может он конечно и проще, но он не всегда доступен. Особенно если будет хостинг виртуальный, и не будет возможности управлять настройками php - не прокатит
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
26.09.2025, 20:17
А зачем нужно управлять настройками PHP? Чтобы включить "system"?
Мне кажется таких спартанских виртуальных хостингов, где запрещено вообще всё, включая "system" уже не осталось.
0
3055 / 1455 / 264
Регистрация: 16.03.2008
Сообщений: 6,490
Записей в блоге: 2
26.09.2025, 22:27
ну я давно не имел дело с виртуальными. Может быть
Тем не менее:
1. Так или иначе это дополнительный риск инъекций - надо быть более внимательным
2. При выполнении system - в консоль пойдет вывод - нужно ли это?
3. Обработка ошибок в скрипте сложнее
4. Как вы и сказали это для linux - т.е. теряете кроссплатформенность. А вдруг надо будет на винде запускать?

Уж если пользоваться системными, то может лучше exec - там имеем несколько больше управляемости

По поводу "спартанских". Это все связано с безопасностью, и частенько бывает на проектах закрыты и exec и system самими администраторами конкретного проекта. У меня есть модуль для одной из CMS где используется exec - и знаю по фидбеку, что случай запрета распространен
0
Эксперт PHP
 Аватар для liris
5119 / 1080 / 158
Регистрация: 16.01.2023
Сообщений: 2,664
29.09.2025, 06:19
Цитата Сообщение от voral Посмотреть сообщение
По поводу "спартанских". Это все связано с безопасностью, и частенько бывает на проектах закрыты и exec и system самими администраторами конкретного проекта.
Соглашусь. В корпоративном сегменте обычно все подобные "лайфхаки" запрещены, а если нужно что-то открыть - только по согласованию с ИБшниками и с железобетонными аргументами, почему без этого нельзя обойтись.
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
30.09.2025, 15:48
Цитата Сообщение от voral Посмотреть сообщение
1. Так или иначе это дополнительный риск инъекций - надо быть более внимательным
Не вижу риска. Нужно быть очень криворуким чтобы их допустить. И если это тот случай, то либо речь о проекте, который нафиг никому не нужен и пытаться что-то взломать никто не будет. И боты тоже. Они могут выполнять шаблонные действия, пытаясь взламывать пополярные ПО с открытым кодом.

Цитата Сообщение от voral Посмотреть сообщение
2. При выполнении system - в консоль пойдет вывод - нужно ли это?
Без разницы какой будет вывод - его всё равно никто никогда не увидит. А если по каким-то причинам это важно, то его можно просто подавить.

Цитата Сообщение от voral Посмотреть сообщение
3. Обработка ошибок в скрипте сложнее
Так как нет никакого скрипта, то и нечего отлавливать. Единственный вариант почему удаление может быть неудачным - это ошибка в правах доступа. Обычно такие случаю исключены и не требуют дополнительной обработки. Если же это важно, то в PHP без проблем можно получить код возврата или даже весь вывод и обрабатывать ошибки.

Цитата Сообщение от voral Посмотреть сообщение
4. Как вы и сказали это для linux - т.е. теряете кроссплатформенность. А вдруг надо будет на винде запускать?
Если проект работает на Linux, то он никогда не переедет на Windows. Никогда. Обратное тоже справедливо. Единственный вариант, для чего может понадобиться запустить проект на иной платформе - это локальная разработка. Если это важно, можно предусмотреть такой вариант, единственное отличие - это немного отличающаяся команда: rmdir" вместо "rm".

Цитата Сообщение от voral Посмотреть сообщение
Уж если пользоваться системными, то может лучше exec - там имеем несколько больше управляемости
Если есть необходимость в анализе вывода, то да, лучше.

Цитата Сообщение от voral Посмотреть сообщение
Это все связано с безопасностью, и частенько бывает на проектах закрыты и exec и system самими администраторами конкретного проекта
Автор поста об этом ничего не говорил, плохая идея предусматривать варианты, которых не существует.
Мне много приходится рефакторить и я часто вижу супер универсальный код с идеальными зонами ответственности и соответствующий всем модным шаблонам. Часто я называю этот код плохим. Почему?
Потому что разработчик потратил очень много времени на этот код. Потому что для его поддержания требуется уделять много времени. Потому что квалификация разработчика должна быть выше. И самое главное - потому что этот код забирает много ресурсов сервера.
С этим можно мириться, если цель оправдана. Но обычно программист заботиться об универсальности. Той самой универсальности, которая ТОЧНО никогда не понадобится.

Я просто предложил простое решение. Разумеется, есть случаи, когда это решение не применимо, но применять сложный подход не понимая для чего - это ошибка. Если проект простой, то обычно никакой необходимости в сложных решениях нет. Если проект сложный, то довольно скоро придётся оптимизировать проблемные участки кода. Тактика просто купить сервер пожирнее не всегда даст положительный результат, так как с возрастающей полезной нагрузкой так же растёт паразитная нагрузка.
0
3055 / 1455 / 264
Регистрация: 16.03.2008
Сообщений: 6,490
Записей в блоге: 2
30.09.2025, 18:19
Главное , чтобы привычка "писать просто" не стало правилом

Цитата Сообщение от cia Посмотреть сообщение
Без разницы какой будет вывод - его всё равно никто никогда не увидит. А если по каким-то причинам это важно, то его можно просто подавить.
Ну т.е. вот ваш "простой код" начинает обрастать дополнительным кодом.

Цитата Сообщение от cia Посмотреть сообщение
Обычно такие случаю исключены и не требуют дополнительной обработки
Ну вряд ли разработчику стоит оперировать понятием "обычно". Оставьте это заказчикам Избавит от лишнего рефакторинга в будущем. Лучше сделать приложение устойчивое к внешним воздействиям. Не зачем пользователю видеть тупик приложения когда на пятый год работы все пошло ни как "обычно". Тем более тут нет ни каких сложностей - все тривиально.

Цитата Сообщение от cia Посмотреть сообщение
Если же это важно, то в PHP без проблем можно получить код возврата или даже весь вывод и обрабатывать ошибки
Конечно же регулярками обрабатывать вывод это сильно "проще код" чем обработка исключений и условий

Цитата Сообщение от cia Посмотреть сообщение
Если проект работает на Linux, то он никогда не переедет на Windows. Никогда. Обратное тоже справедливо
Ну... я бы не сказал..... Например у нас однажды проект поехал на выставку и надо было развернуть его на компе того кто презентовал (правда задолбалось мне с виндой бороться и я просто виртуалку поставил, но это другая история)
А уж с винды на линукс..... очень легко... да и про разработку - вполне себе реальное.

Но самый главный факт: на проектах действительно часто есть подобные ограничения.

а так да. если это скрипт запустить один раз и выкинуть... можно...

Добавлено через 3 минуты
Но вообще, я же не говорил, что надо делать не так как вы. Я лишь уточнил, что это не всегда доступно. И тому есть ряд причин.
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
01.10.2025, 17:51
Цитата Сообщение от voral Посмотреть сообщение
Ну т.е. вот ваш "простой код" начинает обрастать дополнительным кодом.
И в чём же он обрастает? В строке "> /dev/null"?

Цитата Сообщение от voral Посмотреть сообщение
Ну вряд ли разработчику стоит оперировать понятием "обычно"
А я считаю что как раз таки стоит. Дело в том что "обычно" - это заранее почти на 100% точно известно. Спросите у автора поста планирует ли он настраивать обработку случаев, когда на сервере кто-то или что-то случайно поменяет права доступа на файл. Почти наверняка он скажет "нет". Тогда зачем пытаться обрабатывать такой случай? И, собственно, решения на PHP эту проблему не решают: всё так же нужно предусматривать такой вариант.
По крайней мере я, как тимлид не хотел бы чтобы разработчик тратил часы, а может и дни, чтобы предусмотреть сценарий, который я точно знаю что никогда не случатся.

Цитата Сообщение от voral Посмотреть сообщение
Конечно же регулярками обрабатывать вывод это сильно "проще код" чем обработка исключений и условий
Зачем парсить? Я об этом не говорил. Если код ответа не нулевой, значит произошла ошибка. В этом случае, если нужен контекст, то весь вывод exec() отправляем в лог. На чистом PHP мы бы сделали тоже самое, только в формате исключений.

Цитата Сообщение от voral Посмотреть сообщение
Ну... я бы не сказал..... Например у нас однажды проект поехал на выставку и надо было развернуть его на компе того кто презентовал (правда задолбалось мне с виндой бороться и я просто виртуалку поставил, но это другая история)
В итоге ожидаемо не получилось. Просто нужно было запустить докер.

Цитата Сообщение от voral Посмотреть сообщение
А уж с винды на линукс..... очень легко... да и про разработку - вполне себе реальное.
И в этом случае единственное что изменится, это команда: вместо rm будет rmdir. Это по прежнему умещается в одну строчку.

Цитата Сообщение от voral Посмотреть сообщение
Но самый главный факт: на проектах действительно часто есть подобные ограничения.
Может быть. Я с подобным не сталкивался. И, самое главное, автор поста об этом ничего не говорил. Значит нужно предложить самое простое решение )
0
3055 / 1455 / 264
Регистрация: 16.03.2008
Сообщений: 6,490
Записей в блоге: 2
01.10.2025, 18:12
Цитата Сообщение от cia Посмотреть сообщение
В итоге ожидаемо не получилось. Просто нужно было запустить докер.
Не получилось только потому, что мне я взял популярную на тот момент сборку лампа, но мне стало лень ковыряться с ней в винде, коей я сам тогда не пользовался.

Докер появился в 2013 судя по вике. Я не являюсь его автором и не мог его на ранней стадии юзать

Цитата Сообщение от cia Посмотреть сообщение
Может быть. Я с подобным не сталкивался.
Ну.. бывает... Вот сравнительно недавно читал заявленные уязвимости как минимум в двух очень популярных cms (причем как минимум в одной уязвимость не в самой cms а в очень популярном модуле). Подробностей не буду расписывать, но как ключевые моменты ajax и unserialize. Добавить к этому разрешенные exec и system и вполне себе понятна мотивация админов по максимуму прикрыть лавочку. Самое главное то ценность их в открытом состоянии..... ну хз... у меня код не вызывает сложностей приведенный выше. И уж тем более, как вы выше отмечали, для тех у кого низкая квалификация, пусть лучше через пхп делают...

А так колхоз дело добровольное. Как мимнимум удаление алгоритм не той сложности чтобы стоило тут эти упрощения делать.


Цитата Сообщение от cia Посмотреть сообщение
А я считаю что как раз таки стоит. Дело в том что "обычно" - это заранее на 100% точно известно заранее.
Сомнительное утверждение. Тоже когда то слушал заказчика, который утверждал, что некоего события произойти не может, а потом в самый не подходящий момент "караул спасите памагите". Да может этот момент выстрелит через года, два, три... А бывало случаи, когда в ходе дальнейшего развития проекта,складывалась ситуация "не как всегда"...

Ну так же и ТСу через год заказчик придет и попросит доработать, да так ,что в итоге в команду прилетит строка в которой можно будет && использовать.....

Добавлено через 3 минуты
Цитата Сообщение от cia Посмотреть сообщение
И в чём же он обрастает? В строке "> /dev/null"?
ну если вы считаете нормальным (ну или такая задача уровня "и так сойдет") и не надо ни каких обработок, исключений и т.п. то да не обрастет.
0
 Аватар для Серибериешка
3 / 3 / 0
Регистрация: 19.10.2025
Сообщений: 65
21.10.2025, 12:43
Цитата Сообщение от andrey_f Посмотреть сообщение
if (!is_dir($dir)) {
        // Если это не директория, можно попытаться удалить как файл
        if (file_exists($dir)) {
бэмц
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2025, 12:43
Помогаю со студенческими работами здесь

Можно ли отправить файл на почту, не переместив её в директории на сервере с временной директории?
Всем добрый день, вопрос такой. Можно ли обращаться к файлу до его перемещения с временной...

Как считать содержимое файла, который на одну директорию выше
здравствуйте. как считать содержимое файла, который на одну директорию выше? пробовал как обычно...

Как удалить все файлы, пустые и непустые папки из текущей директории?
Подскажите, как удалить все файлы, пустые и непустые папки из текущей директории.

Вывод содержимого директории
Как вывести содержимое какой-нибудь директории?

Сравнение файлов и директорий на содержимое
Вопрос не про php но не знаю к какому разделу относится. Прошу модераторов перенести при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru