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

Статус
В этой теме нельзя размещать новые ответы.

bugargen

Местный житель
Регистрация
24 Апр 2008
Сообщения
234
Реакции
20
Пожалуйста, приведите эту функцию к идеальному виду (крайне желательно - современно, т.е. - через 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 < 2 )
    {
        $result[1] = 0;
    }

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

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

ЗЫ: Возможно, помимо косяка со статическими переменными, приведённый пример в целом не хлещет оптимальностью. Если это так, то переделайте к нужному виду, плз:ah:
 
Современно и красиво - это юзать итераторы из SPL.
Стучите, если сами не вкурите, что это значит.
 
Современно и красиво - это юзать итераторы из SPL.
Стучите, если сами не вкурите, что это значит.
Благодарю за наводку на сию полезную библиотеку PHP, да ещё и встроенную в него :ay:

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

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

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

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