Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Как удалить все директории с одинаковым префиксом?


Автор: Pavl 25.9.2020, 16:18
Добрый день!
Изучаю урок, касающийся работы с каталогами, файлами.
В каталоге есть директории с одинаковым префиксом (pref_)
Нужно удалить при помощи php все папки с таким префиксом.
Как это можно сделать?
Испробовал много вариантов, но ничего не получается.
Например, пробовал так:

Код

$dir = 'C:/OSPanel/domains/test/www/uroki/';

if ($handle = opendir($dir)) {
    while (false !== ($entry = readdir($handle))) {
        if (is_dir($dir . $entry) && strtolower(substr($entry, 0, 2)) == 'pref_') {
            rmdir($dir . $entry);
        }
    }
    closedir($handle);
}


При обновлении скрипта ничего не происходит, только пустой экран, а папки с префиксом pref_ остаются, не удаляются.


Автор: Oldshelf 25.9.2020, 20:06
Код

$dir = 'C:/OSPanel/domains/test/www/uroki/';
if ($handle = opendir($dir)) {
    while (false !== ($entry = readdir($handle))) {
        if (is_dir($dir . $entry) && strtolower(substr($entry, 0, 5)) == 'pref_') {
            rmdir($dir . $entry);
        }
    }
    closedir($handle);
}

Автор: Pavl 26.9.2020, 16:03
Oldshelf, да, папки удаляются, но только пустые, а если с каким-то файлом внутри, то нет. Можно ли, как-то удалить папку вместе с вложенными файлами?

Автор: Oldshelf 26.9.2020, 16:15
Можно, но не встроенной функцией:
Цитата

... Директория https://php.ru/manual/function.rmdir.html и должны иметься необходимые для этого права. 


Советуют удалять такие директории с помощью рекурсии:
https://stackoverflow.com/questions/1653771/how-do-i-remove-a-directory-that-is-not-empty/1653776#1653776
https://habr.com/ru/sandbox/124577/

Автор: Pavl 26.9.2020, 18:10
Цитата

https://habr.com/ru/sandbox/124577/


Скажите, пожалуйста, что я не так делаю? Попробовал по этой ссылке.

Код

$dir = 'C:/OSPanel/domains/test/www/uroki/';

function recursiveRemoveDir($dir) {

    $includes = glob($dir.'pref_');

    foreach ($includes as $include) {

        if(is_dir($include)) {

            recursiveRemoveDir($include);
        }

        else {

            unlink($include);
        }
    }

    rmdir($dir);
}


Не удаляется папка с файлом.

Автор: Oldshelf 26.9.2020, 20:40
Не нужно ничего менять в приведённой функции:

Код

function recursiveRemoveDir($dir) {
    $includes = glob($dir.'/*');

    foreach ($includes as $include) {
        if(is_dir($include)) {
            recursiveRemoveDir($include);
        }
        else {
            unlink($include);
        }
    }

    rmdir($dir);
}

$dir = 'C:/OSPanel/domains/test/www/uroki/';

if ($handle = opendir($dir)) {
    while (false !== ($entry = readdir($handle))) {
        if (is_dir($dir . $entry) && strtolower(substr($entry, 0, 5)) == 'pref_') {
            recursiveRemoveDir($dir . $entry);
        }
    }
    closedir($handle);
}

Автор: Pavl 27.9.2020, 14:34
Oldshelf, спасибо, всё работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)