Получение инфы о каталоге/файле через рекурсию. Неувязочка...

Тема в разделе "Как сделать...", создана пользователем bugargen, 10 фев 2010.

Статус темы:
Закрыта.
  1. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Пожалуйста, приведите эту функцию к идеальному виду (крайне желательно - современно, т.е. - через glob, а не readdir:(

    PHP:
    function _info $path )
    {
        static 
    $i 0// Счётчик для определения наличия вложенных директорий (на случай запроса информации по единичному файлу).

        
    static $result = array // Массив с результатами.
            
    (
                 
    0// Общий (конечный) размер в байтах.
                
    -1// Количество директорий.
                 
    0  // Количество файлов.
            
    );

        
    // Работа с очередным файлом.
        
    if ( is_file $path ) )
        {
            
    $result[2]++;

            
    $result[0] += filesize $path );
        }
        
    // Работа с очередным каталогом.
        
    elseif ( is_dir $path ) )
        {
            
    $i++;

            
    $result[1]++;

            
    $list glob $path '/*' );

            foreach ( 
    $list as $k => $v )
            {
                
    _info $list[$k] ); // Рекурсия.
            
    }
        }

        
    // Проверка на наличие вложенных директорий.
        
    if ( $i )
        {
            
    $result[1] = 0;
        }

        return 
    $result// Возврат массива с результатами.
    }
    В данном виде - функция отрабатывает на отлично, но если её из одного и того же скрипта вызвать более одного раза, то результаты её работы суммируются, т.к. используются статические переменные.

    х.з., как красиво решить эту проблему.

    ЗЫ: Возможно, помимо косяка со статическими переменными, приведённый пример в целом не хлещет оптимальностью. Если это так, то переделайте к нужному виду, плз:ah:
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Современно и красиво - это юзать итераторы из SPL.
    Стучите, если сами не вкурите, что это значит.
     
    bugargen нравится это.
  3. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Благодарю за наводку на сию полезную библиотеку PHP, да ещё и встроенную в него :ay:

    Покопавшись на официальном сайте по ману SPL (если это можно назвать маном :D) я так и не понял, как это можно грамотно использовать для того, чтобы пробежаться по всем каталогам и файлам указанного пути. Выходило, что по старинке (через readdir()) проще. Смотрел примеры (на оф. сайте и в инете) - всё какое-то убогое и громоздкое (где, спрашивается, выгода и удобство?). Но, на том же оф. сайте, случайно увидел последний камент воистинну волшебника: он разорвал всё в пух и прах! ВСЁ РЕШАЕТСЯ ОДНОЙ СТРОКОЙ!!! :thenks: Вот мой вариант этого решения (в одну строку - без лишних объявлений переменных и т.п.:(

    PHP:
    foreach ( new RecursiveIteratorIterator ( new RecursiveDirectoryIterator 'ПУТЬ' ), RecursiveIteratorIterator :: SELF_FIRST ) as $v )
    ВСЁ! Делай в этом цикле всё, что хочешь (проверки на вхождения того или иного, размер и т.д. и т.п.)! Этот цикл всего в одну строку проходит по всем каталогам и файлам! Больше не нужно использовать никаких собственных рекурсий (смотри мой пример в первом посте), где может быть масса проблем и ограничений (например, когда на выходе должен быть не только банальный размер каталога, но и другие данные: количиство каталогов, файлов, с которыми, между прочим, нужно работать здесь же дальше, НО ТОЛЬКО после того, как завершится цикл шуршания по всем каталогам и файлам, НЕ РАНЬШЕ! - хрен это получится через обычную свою рекурсию, ни одного примера в Инете не видел).

    Осталось только одно НО...
    PHP_Master, я пытался разобраться в принципе работы указанной мною чудо-конструкции, но так и не смог этого сделать, прошу тебя разъяснить - как сиё работает :)

    ЗЫ: Понял только, что если убрать RecursiveIteratorIterator :: SELF_FIRST, то конструкция будет бегать только по каталогам с файлами, пустые каталоги будут пропускаться. Но почему и как это работает, опять же - я х.з. :)
     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Именно это я и имел в виду :)
    Чтоб понять рекурсию, нужно понять рекурсию :D
    Хотя ман по SPL - это жесть, но ответ на этот вопрос там имеется: если убрать этот параметр, то выбираться будут только детки.
     
Статус темы:
Закрыта.