|
|
|
| Ответ 006 на задачу N 8.
С условиями задачи можно ознакомится по ссылке.
Здравствуйте. Вот скрипт SIZE.PHP для задачи №8.
<?php
//======== SIZE.PHP для задачи № 8 ================================
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//======= ФУНКЦИЯ ListRootDir($mydir)=============================
//Просматривает корневой каталог и составляет список подкаталогов,
//содержащихся в нём
//====================================================================
function ListRootDir($mydir)
{
//Массив для хранения названий подкаталогов родительского каталога
global $array;
//Индекс массива
$i=0;
//открываем каталог
$handler=opendir($mydir);
//Обходим все файлы
while (false !== ($file = readdir($handler)))
{
//Если это каталог
if(is_dir($file)==true)
{
//Если корневой или родительский ничего не делаем
if ($file != "." && $file != "..")
{
//Иначе Составляем список подкаталогов данного каталога
$array[$i]=$file;
$i++;
}
}
}
//Закрываем каталог
closedir($handler);
}
//Конец функции
//===========================================================
//=============функция CalcDirSize($mydir) ==================
//Вычисляет размер каталога, переданного в параметре $mydir
//=============================================================
function CalcDirSize($mydir)
{
//Сюда заносится размер каталога
global $RootDirSize;
//Запоминаем каталог, из которого пришли
$parentdir=getcwd();
//открываем каталог
$handler=opendir($mydir);
//Устанавливаем здесь текущий каталог
chdir($mydir);
//Обходим все файлы
while (false !== ($file = readdir($handler)))
{
//Определяем размер файла
$filesize=filesize($file);
//Добавляем размер файла к размеру всего каталога
$RootDirSize+=$filesize;
//Если это каталог
if(is_dir($file)==true)
{
//Если корневой или родительский ничего не делаем
if ($file != "." && $file != "..")
{
//Для каждого подкаталога вызываем эту же функцию
CalcDirSize($file);
}
}
}
//Закрываем каталог
closedir($handler);
//Устанавливаем текущим каталогом тот, из которого пришли
chdir($parentdir);
}
//Конец функции
//=================================================================
//================= САМА ПРОГРАММА ================================
//Массив для хранения названий подкаталогов родительского каталога
global $array;
//Сюда заносится размер каталога
$RootDirSize=0;
//Определяем текущий каталог
$mydir=getcwd();
//Составляем список подкаталогов корневого каталога
ListRootDir($mydir);
//Вычисляем размер содержимого корневого каталога
CalcDirSize($mydir);
//Выводим таблицу
echo('<table width="75%" border="1"><tr><td>КАТАЛОГ</td><td>РАЗМЕР</tr>');
echo('<tr><td>'.$mydir.'</td><td>'.$RootDirSize.'</tr>');
//Вычисляем размер каждого из подкаталогов корневого каталога
foreach ($array as $line_num => $line)
{
$RootDirSize=0;
CalcDirSize($line);
echo('<tr><td>'.$mydir.'\\'.$line.'</td><td>'.$RootDirSize.'</tr>');
}
echo('</table>');
?>
|
http://www.softtime.ru/info/task.php?id_article=78 | |
|
|
|
|
|
|
|
для: SoftTime
(21.02.2006 в 22:57)
| | Несколько громоздко, но скрипт прекрасно справляется со своей задачей, а от него это в первую очередь и требуется. Программа пытающаяся реализовать очень хитрое и красивое решение не может называться программой, если она не работает. Скрипт не зависит от функции scandir(), которая появилась в PHP 5, учитывает родительскую .. и текущую . директории. Обыно не используют функцию chdir() для реального перемещения по каталогам, предпочитая изменять путь, передаваемый фукнции opendir(). Но такой подход не является запрещённым, более того приводит к тому, что сразу исключается целый класс ошибок связанных с удвоением слеша при формировании пути. Правда расплатой за это является лишний вызов функции chdir() и увеличивающийся объём кода, а чем более объёмный код, тем больше вероятность совершить ошибку. Очень хорошо, что используется две функции - они именно для этого и предназначены разбить код на как можно большее число мелких частей, так как легче отладить несколько небольших блоков кода, чем один большой. | |
|
|
|