Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Подсчет размера файлов в директориях и в поддиректориях
Задача
Предположим, что вам нужно подсчитать размер всех файлов начиная с текущей директории, получить их число и количество вложенных поддиректорий. Подобные задачи решаются применением рекурсии, то есть обращения функции к самой себе.
Решение задачи
Благодаря способности PHP выполнять рекурсивные запросы к функциям (а также к методам классов) стало возможным решить платформо-независимую задачу подсчета размера файлов в директориях.
Приведем пример класса на php, решающего задачу подсчета размера всех файлов, вложенных в директорию и в поддиректории:
class calc_dir
{
var $a_fname=[];
var $a_fsize=[];
var $a_fdir =[];
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 "<table><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>";
}
}//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();
.
Прокомментировать/Отблагодарить