БлогNot. Строим дерево каталогов на PHP 5 или 4

Строим дерево каталогов на 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.'&nbsp;&nbsp;'); 
  } 
 } 
} 

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 [11622 просмотра]


теги: программирование php

К этой статье пока нет комментариев, Ваш будет первым