Печать дерева каталогов файловой системы

Пример формирует дерево каталогов файловой системы на PHP

// Печать дерева каталогов файловой системы.
// Функция распечатывает имена всех подкаталогов в текущем каталоге,
// выполняя рекурсивный обход. Параметр $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($_SERVER['DOCUMENT_ROOT']);
PrintTree();
echo "</pre>";

DirectoryIterator

Для элегантности можно использовать DirectoryIterator:

// Создаем новый объект DirectoryIterator
$dir = new DirectoryIterator("/my/directory/path");
// Цикл по содержанию директории
foreach ($dir as $item) {
  echo $item . "<br>";
}

С помощью методов DirectoryIterator::isDot(), DirectoryIterator::getType() и DirectoryIterator::getSize(), можно получить информацию о директории.

Для рекурсивного обхода файловой системы можно использовать RecursiveDirectoryIterator:

// Создаем новый объект RecursiveDirectoryIterator
$iter = new RecursiveDirectoryIterator("/my/directory/path");

// Цикл по списку директории
// Нужно создать новый экземпляр RecursiveIteratorIterator
foreach (new RecursiveIteratorIterator($iter) as $item) {
  echo $item . "<br>";
}

RecursiveDirectoryIterator не возвращает пустых директорий: если директория содержит много поддиректорий, но без файлов, результат будет пустым.


.