САМОУЧИТЕЛЬ PHP 4


печать дерева каталогов


В заключение приведу пример программы, которая рекурсивно распечатывает список всех каталогов (доступных сценарию) в вашей системе, начиная от корневого.

Листинг 16.1. Печать дерева каталогов в файловой системе

<?

// Функция распечатывает имена всех подкаталогов в текущем каталоге,

// выполняя рекурсивный обход. Параметр $level задает текущую

// глубину рекурсии.

function PrintTree($level=1)

{

  // Открываем каталог и выходим в случае ошибки

  $d=@opendir(".");

  if(!$d) return;

  while(($e=readdir($d))!==false) {

    // Игнорируем элементы .. и .



    if($e=='.'||$e=='..') continue;

    // Нам нужны только подкаталоги

    if(!@is_dir($e)) continue;

    // Печатаем пробелы, чтобы сместить вывод

    for($i=0; $i<$level; $i++) echo "  ";

    // Выводим текущий элемент

    echo "$e\n";

    // Входим в текущий подкаталог и печатаем его

    if(!chdir($e)) continue;

    PrintTree($level+1);

    // Возвращаемся назад

    chdir("..");

    // Отправляем данные в браузер, чтобы избежать видимости зависания

    // для больших распечаток

    flush();

  }

  closedir($d);

}

// Выводим остальной текст фиксированным шрифтом

echo "<pre>";

echo "/\n";

// Входим в корневой каталог и печатаем его

chdir("/");

PrintTree();

echo "</pre>";

?>

Сразу хочу предупредить, что результат работы этого сценария представляет собой довольно длинную распечатку. Кроме того, программа работает медленно, т. к. ей нужно будет обойти тысячи каталогов вашей системы.

Последний факт делает метод рекурсивного обхода каталогов совершенно непригодным для автоматического построения карты сервера. В случае применения технологии кэширования информации между запусками сценариев для больших сайтов построение карты даже, скажем, раз в час, выглядит довольно плачевно. Как обойти эту трудность (фактически, используя кэш и разделенные вычисления) рассказано в части V этой книги.



Содержание раздела