|
|
|
| Ответ 001 на задачу N 9.
С условиями задачи можно ознакомится по ссылке.
Здравствуйте. Вот ответ на задачу №9.
<?php
/*
Требуется создать скрипт size_all.php, который строит полное дерево подкаталогов (начиная с текущего), выводит это дерево с отступами для вложенных подкаталогов, а также указывает общий объем занимаемого места для каждого подкаталога. Файлы выводить не нужно.
*/
//функция для подсчёта объёма каталога
function CalcDirSize($mydir)
{
//В этой переменной храним размер каталога
$DirSize=0;
//Глобальный массив, содержащий форматированные строки для вывода
global $array;
//Индекс глобального массива $array
global $i;
//Массив, для хранения каталогов первого уровня данного каталога
$arrayDir=array();
//Индекс для $arrayDir
$iarrayDir=0;
//Массив для сортировки по алфавиту каталогов
$sortArray=array();
//Количество отступов для вложенных каталогов
global $k;
//Строка для занесения в глобальный массив $array
$string='';
//Строка, содержащая пробелы для отступа вложенных каталогов
$probel='|------';
//Увеличиваем количество отступов для вложенных каталогов
$k++;
//Запоминаем каталог, из которого пришли
$parentdir=getcwd();
//открываем каталог
$handler=opendir($mydir);
//Устанавливаем здесь текущий каталог
chdir($mydir);
//Обходим все файлы
while (false !== ($file = readdir($handler)))
{
//Определяем размер файла
$filesize=filesize($file);
//Добавляем размер файла к размеру всего каталога
$DirSize+=$filesize;
//Если это каталог
if(is_dir($file)==true)
{
//Если корневой или родительский ничего не делаем
if ($file != "." && $file != "..")
{
//Заносим имена каталогов в массив
$arrayDir[$iarrayDir]=$file;
$iarrayDir++;
}
}
}
// Для того, чтобы сортировка была строго по алфавиту, нужно выключить чувствительность к регистру
foreach($arrayDir as $line_num => $line)
{
$index = strtolower($line);
$sortArray[$index]=$line;
}
//Сортируем массив по ключевому полю в обратном порядке
krsort($sortArray);
//Для каждого каталога вызываем функцию CalcDirSize($file)
foreach($sortArray as $line_num => $line)
{
$DirSize+=CalcDirSize($line);
}
//Формируем строку пробелов для отступа вложенных каталогов по сравнению с родительским
$probel=str_repeat($probel,$k);
//Формируем строку, содержащую необходимый отступ, имя каталога, его размер
$string=sprintf("<table><tr><td>%s</td><td><b>%s</b></td><td> </td><td>%s байт</td><td></tr></table>",$probel,$mydir,$DirSize);
//И заносим эту строку в глобальный массив $array
$i++;
$array[$i]=$string;
//Закрываем каталог
closedir($handler);
//Устанавливаем текущим каталогом тот, из которого пришли
chdir($parentdir);
//Уменьшаем количество отступов для вложенных каталогов
$k--;
//Возвращаем размер каталога
return($DirSize);
}
//Конец функции CalcDirSize($mydir)
////////////////
global $array;
global $k;
global $i;
$k=-1;
$i=-1;
//Определяем текущий каталог
$mydir=getcwd();
CalcDirSize($mydir) ;
//Выводим сформированный массив $array в обратном порядке
for ($a = $i; $a>=0 ; $a--)
{
echo($array[$a]);
}
?>
|
http://www.softtime.ru/info/task.php?id_article=79 | |
|
|
|
|
|
|
|
для: SoftTime
(24.02.2006 в 12:55)
| | Я в восхищении. Отличный скрипт, со своей задачей скрипт справляется блестяще, формируя элегантную систему отступов. Использование глобальных переменных лучше избегать, но в данной задаче, я бы пожалуй тоже ими воспользовался.
PS Так как скрипта всего два, а тонкости разбирали в предыдущей задаче, то оцеки выставляются по читабельности и оригинальности, соответственно 4 и 5. | |
|
|
|