Строим дерево каталогов на PHP 5 или 4
В PHP5 появилась функция scandir
, получающая список файлов и каталогов, расположенных по указанному пути. Применение этой функции плюс рекурсии позволяет легко написать скрипт для построения дерева каталогов на PHP:
<?php function sizedir($folder) { $files = scandir($folder); $c=0; foreach($files as $file) { if ($file=='.' or $file=='..') continue; $f0=$folder.'/'.$file; if (is_file($f0)) $c += filesize($f0); if (is_dir($f0)) $c += sizedir($f0); } return $c; } function getsize ($bytes) { if ($bytes<1024) return $bytes.' байт'; else if ($bytes<1048576) return round ($bytes/1024,2).' Кб'; else if ($bytes<1073741824) return round ($bytes/1048576,2).' Мб'; else return round ($bytes/1073741824,2).' Гб'; } function showdir($folder,$begin) { $files = scandir($folder); foreach($files as $file) { if ($file=='.' or $file=='..') continue; $f0=$folder.'/'.$file; if (is_dir($f0)) { echo '<tr><td>'.$begin.$file.'</td><td>'.$begin.getsize(sizedir($folder.'/'.$file)).'</td></tr>'."\n"; showdir($f0,$begin.' '); } } } echo '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Вывод каталогов рекурсивно</title> </head><body>'; $dir='./'; echo '<font face="Courier New"><table border="0" cellpadding="0" cellspacing="0">'."\n"; //echo '<tr><td>.</td><td>'.getsize(sizedir($dir)).'</td></tr>'; showdir($dir,''); echo '</table></font>'; echo '</body></html>'; ?>
Скрипт может выполняться довольно долго, если в папке $dir
много вложенных папок и файлов (в примере дерево смотрится от корня сервера!). Для "симметричности" всё выводится моноширинным шрифтом Courier New
, а чтобы избежать огромных чисел (размеры папок-то считаются в байтах),
метод getsize
переводит размер в байтах в Кб или Мб, оставляя байты только для файлов меньше 1 Кб.
Если нужно дополнительно показать размер самой папки $dir
, от которой строится дерево, раскомментарьте одну строчку в листинге:
//echo '<tr><td>.</td><td>'.getsize(sizedir($dir)).'</td></tr>';
Если нужно, чтобы работало на PHP4, можно просто добавить в листинг свою scandir
:
function scandir($folder) { $dir = opendir($folder); $list=array(); while ($file=readdir($dir)) $list[] = $file; closedir($dir); return $list; }
Окончание - на странице статьи
05.02.2011, 16:54 [11685 просмотров]