Мой сайт
Главная
Вход
Регистрация
Вторник, 17.06.2025, 15:50Приветствую Вас Гость | RSS
Меню сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » 2010 » Февраль » 10 » Цикл от человека - Рекурсия от Бога.
03:04
Цикл от человека - Рекурсия от Бога.

(подсчет размера файлов в директории и в поддиректориях)

Введение

Предположим что вам нужно подсчитать размер всех файлов начиная с текущей директории, получить их число и количество вложенный поддиректорий. Подобные задачи решаться применением рекурсии - то есть обращения из функции к самой себе.

Решение задачи

Благодаря способности 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 "
"
echo "";
$a_size=0;
for ($i=0;$ia_fname);$i++)
{
echo "
";
$a_size+=$this->a_fsize[$i];
}
echo "
";
echo "
inamesizedir
".($i+1);
echo "
".$this-> a_fname[$i];
echo "
".$this->a_fsize[$i]."
".$this->a_fdir[$i]."
Total: $a_size
";
}

}//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();
Просмотров: 431 | Добавил: cocoucoz | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск

Календарь
«  Февраль 2010  »
Пн Вт Ср Чт Пт Сб Вс
1234567
891011121314
15161718192021
22232425262728

Архив записей


Copyright MyCorp © 2025Конструктор сайтовuCoz