Цикл від людини – Рекурсія від Бога.

(Підрахунок розміру файлів в директорії і в піддиректоріях)

Введення

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

Рішення завдання

Завдяки здатності PHP виконувати рекурсивні запити до функцій (а також до методів класів) стало можливим вирішити платформо – незалежну завдання підрахунку розміру файлів в директоріях.

Наведемо приклад класу на 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>" echo "<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); echo "</ td> <td>". $ this-> a_fname [$ i]; echo "</ 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 = 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();

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*