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

Тема в разделе "Как сделать...", создана пользователем prosto-chups, 15 авг 2013.

  1. prosto-chups

    prosto-chups ВТР

    Регистр.:
    3 фев 2009
    Сообщения:
    251
    Симпатии:
    161
    Ребята, подскажите, торможу и не могу написать правильно...
    Нужна функция или скрипт (все равно в кроне) для удаления пустых папок.
    Например:
    И в папке "upload" удаляются только пустые папки...
    Но сама категория остается...
     
  2. Maza

    Maza

    Регистр.:
    3 июл 2007
    Сообщения:
    255
    Симпатии:
    118
    Думаю можно оптимизировать убрав функцию isEmpty, но честно говоря влом :). Так тоже работает. Можно добавить проверку не пуста ли папка upload
     
    prosto-chups нравится это.
  3. mpv

    mpv Постоялец

    Регистр.:
    30 апр 2013
    Сообщения:
    67
    Симпатии:
    13
    Код:
    find /dir/ -type d -exec rmdir {} +
    ищет все директории и пытается удалить, если в директории или другие директории или файлы rmdir ее не удаляет
     
  4. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    зачем такие сложности?.. элементарно же всё:

    PHP:
    $path '/path/to/needed/root/dir';
     
    $idir = new RecursiveIteratorIterator( new RecursiveDirectoryIterator$pathFilesystemIterator::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";
            }
        }
    }
     
    prosto-chups нравится это.
  5. prosto-chups

    prosto-chups ВТР

    Регистр.:
    3 фев 2009
    Сообщения:
    251
    Симпатии:
    161
    Спасибо!!! Первый способ для меня понятен, второй чуть запутан )))
    Нужно было на PHP, как в *nix я знаю...
     
  6. polo

    polo Создатель

    Регистр.:
    4 окт 2006
    Сообщения:
    29
    Симпатии:
    11
    Так что проверка на непустую директорию излишне.

    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 $filetrue);
            }

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

        }
    }
     
    prosto-chups нравится это.
  7. prosto-chups

    prosto-chups ВТР

    Регистр.:
    3 фев 2009
    Сообщения:
    251
    Симпатии:
    161
    Не совсем понял зачем $remove_root...
    А вызов:
    rmdir_empty('upload');
    Или от корня сайта (аккаунта)?
     
  8. polo

    polo Создатель

    Регистр.:
    4 окт 2006
    Сообщения:
    29
    Симпатии:
    11
    Ну так это чтобы удалить и upload
    rmdir_empty('upload'); - upload останется
    rmdir_empty('upload', true); - upload будет удален если непустой

    PS там используется ф-ция scandir которая доступна только с php 5
     
  9. prosto-chups

    prosto-chups ВТР

    Регистр.:
    3 фев 2009
    Сообщения:
    251
    Симпатии:
    161
    Ага, понял... То есть, в моем случае можно упростить:
    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 $filetrue);
            }
        }
    }

    rmdir_empty('upload'); 
    Все, всем спасибо )))
     
  10. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    prosto-chups, можно поинтересоваться, чем мой вариант не устроил?..

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

    растолкуйте мне, серому, пожалуйста.. ))