Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Сборник статей
 
 

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

Автор: realcoding.net

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

Решение задачи
Благодаря способности 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><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();

 
 » Обсудить эту статью на форуме

 
 Сборник статей 
 Содержание раздела 
Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS