Введение
Предположим что вам нужно подсчитать размер всех файлов начиная с текущей директории , получить их число и количество вложенный поддиректорий. Подобные задачи решаться применением рекурсии — то есть обращения из функции к самой себе.
Решение задачи
Благодаря способности PHP выполнять рекурсивные запросы к функциям (а также к методам классов) стало возможным решить платформо — независимую задачу подсчета размера файлов в директориях.
Приведем пример класса на php решающего задачу подсчета размера всех файлов вложенный в директорию и в поддиректории:
Текст программы
<?
class calc_dir{
var $a_fname=array();
var $a_fsize=array();
var $a_fdir =array();
var $cofiles;
function init()
{
$this->cofiles=0;
}
function calc_files($in_dir)
{
#Так можно отсечь нежелательные имена файлов
#if (preg_match(«/_vti[.]*/i»,$in_dir)){return;}
if ($dir_handle = @opendir($in_dir))
{
while($file = readdir($dir_handle))
{
//Рекурсивный проход по директориям
if ($file!=»..» && $file!=».» && is_dir($file))
{
$this->calc_files($in_dir.»/».$file);
}
//Проход по файлам
if (is_file($in_dir.»/».$file) && $file!=»..» && $file!=».»)
{
$this->a_fname[$this->cofiles]=$file;
$this->a_fsize[$this->cofiles]=filesize ($in_dir.»/».$file);
$this->a_fdir [$this->cofiles]=$in_dir;
$this->cofiles++;
}
}
}
}
function show()
{
echo «<center><table border=\\»1\\»><tr align=\\»center\\»> <td>i</td><td>name</td><td>size</td><td>dir</td></tr>»;
$a_size=0;
for ($i=0;$ia_fname);$i++)
{
echo «<tr align=\\»center\\»><td>».($i+1).»</td><td>».$this-> a_fname[$i].»</td><td>».$this->a_fsize[$i].»</td><td> «.$this->a_fdir[$i].»</td></tr>»;
$a_size+=$this->a_fsize[$i];
}
echo «<tr><td colspan=\\»2\\»>Total:</td><td colspan=\\»2\\»>$a_size</td></tr>»;
echo «</table></center>»;
}
}//end class
$d=new calc_dir;
$d->init();
$d->calc_files(«C:/windows/command/»);
$d->show();
?>
Комментарии
Класс calc_dir имеет 3-ри метода (иначе говоря наша программа имеет три функции). Это :
$d->init(); — Метод исполняющий инициализацию класса (присваивает 0 счетчику найденых файлов)
$d->calc_files(); — Метод (который вызывается рекурсивно) для перебора файлов и директорий в текущей директории
$d->show(); — Метод выводящий собранные данные в виде таблицы
Вызов класса начинается с его создания : $d=new calc_dir;
Поиск файлов начинается с какой-либо директории — для примера я взял директорию C:\\windows\\command — Если у вас ее нет возьмите какую либо другую , например текущую : $d->calc_files(«.»);
После выполнения поиска результаты выводятся с помощью метода класса $d->show().
Вариации на тему
Если вы вдруг захотите отсортировать выводимые файлы по имени вам достаточно добавить в класс метод который может выглядеть вот так :
function sort ()
{
array_multisort (
$this->a_fname,
$this->a_fsize,
$this->a_fdir );
}
А в текст программы нужно добавить его вызов , вот так например :
$d=new calc_dir;
$d->init();
$d->calc_files(«C:/windows/command/»);
$d->sort();
$d->show();
Источник: npksv.ru