Введение
Предположим что вам нужно подсчитать
размер всех файлов начиная с текущей
директории , получить их число и
количество вложенный поддиректорий.
Подобные задачи решаться применением
рекурсии - то есть обращения из функции к
самой себе.
Решение задачи
Благодаря способности 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;$i<count($this->a_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();
Ccылки по теме :
1. Скачать исходные тексты программы можно
тут >>>
2. Статья "Поисковый механизм для
вашего сайта , на PHP" по php на нашем
сайте Перейти
>>>
3. FAQ по PHP . Перейти>>>
24.06.2001 г.Львов
Кириллов А.В.
|