Рекрусивное удаление пустых каталогов (PHP)

prosto-chups

ВТР
Регистрация
3 Фев 2009
Сообщения
252
Реакции
167
Ребята, подскажите, торможу и не могу написать правильно...
Нужна функция или скрипт (все равно в кроне) для удаления пустых папок.
Например:
И в папке "upload" удаляются только пустые папки...
Но сама категория остается...
 
Думаю можно оптимизировать убрав функцию isEmpty, но честно говоря влом :). Так тоже работает. Можно добавить проверку не пуста ли папка upload
 
Код:
find /dir/ -type d -exec rmdir {} +

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

PHP:
$path = '/path/to/needed/root/dir';
 
$idir = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST );
 
foreach( $idir as $v ){
 
    if( $v->isDir() and $v->isWritable() ){
 
        $f = glob( $idir->key() . '/*.*' );
 
        if( empty( $f ) ){
 
            rmdir( $idir->key() );
 
            echo 'remove directory ' . $idir->key() . "\n";
        }
    }
}
 
rmdir - Attempts to remove the directory named by dirname. The directory must be empty, and the relevant permissions must permit this.
Так что проверка на непустую директорию излишне.

PHP:
/**
* Remove empty directories
* @ param string $root Directory path
* @ param bool $remove_root Also remove root
*/
function rmdir_empty($root, $remove_root = false)
{
    $root = realpath($root);
    if ($root AND is_dir($root))
    {
        foreach (scandir($root) AS $file)
        {
            if ($file == '.' OR $file == '..')
                continue;

            if (is_dir($root . DIRECTORY_SEPARATOR . $file))
                rmdir_empty($root . DIRECTORY_SEPARATOR . $file, true);
        }

        if ($remove_root)
            @rmdir($root);

    }
}
 
Так что проверка на непустую директорию излишне.

PHP:
/**
* Remove empty directories
* @ param string $root Directory path
* @ param bool $remove_root Also remove root
*/
function rmdir_empty($root, $remove_root = false)
{
    $root = realpath($root);
    if ($root AND is_dir($root))
    {
        foreach (scandir($root) AS $file)
        {
            if ($file == '.' OR $file == '..')
                continue;

            if (is_dir($root . DIRECTORY_SEPARATOR . $file))
                rmdir_empty($root . DIRECTORY_SEPARATOR . $file, true);
        }

        if ($remove_root)
            @rmdir($root);

    }
}

Не совсем понял зачем $remove_root...
А вызов:
rmdir_empty('upload');
Или от корня сайта (аккаунта)?
 
Ну так это чтобы удалить и upload
rmdir_empty('upload'); - upload останется
rmdir_empty('upload', true); - upload будет удален если непустой

PS там используется ф-ция scandir которая доступна только с php 5
 
Ага, понял... То есть, в моем случае можно упростить:
PHP:
function rmdir_empty($root)
{
    $root = realpath($root);
    if ($root AND is_dir($root))
    {
        foreach (scandir($root) AS $file)
        {
            if ($file == '.' OR $file == '..')
                continue;

            if (is_dir($root . DIRECTORY_SEPARATOR . $file))
                rmdir_empty($root . DIRECTORY_SEPARATOR . $file, true);
        }
    }
}

rmdir_empty('upload');
Все, всем спасибо )))
 
Для просмотра ссылки Войди или Зарегистрируйся, можно поинтересоваться, чем мой вариант не устроил?..

я объясню причину своего интереса: в последнее время стал обращать внимание, что мало кто пользуется spl, итераторами и т.п. встроенным и чертовски удобным и малословным функционалом.. что это?.. не желание/способность воспринимать новое?.. необходимость поддерживать дважды устаревшую версию 5.2 (уже 5.3 заморожена, только багфиксы).. всё же это наитивно, написано на сях, уж точно будет работать быстрее прогона через интерпретатор (т.б. рекурсивно)..

растолкуйте мне, серому, пожалуйста.. ))
 
Назад
Сверху