Генератор форм

Для веб-мастера

Реклама

Подсчет занятого места в каталоге на PHP

Рейтинг:
Дата: 8 ноября 2012 Просмотры 13017

Приветствую тебя, дорогой читатель блога biznesguide.ru. Давненько я не публиковал в блог новых статей. Это связано с тем, что сейчас я занимаюсь разработкой одного онлайн сервиса по создания веб-форм и все силы уходят на него. Так что скоро ждите алфа-версию.

Сегодня я решил написать небольшую статью на тему «Как подсчитать занятое дисковое пространство в каталоге на PHP. Готовой функции в PHP для этого нет, поэтому приходится писать решение самому.

Это можно сделать несколькими способами. Самый простой это открыть нужный каталог и рекурсивно пройтись по всем папкам, подсчитывая тем самым размер каждого файла. Вот как это можно сделать:

function getDirSize($dir_name){
    
    $dir_size = 0;
    if (!is_dir($dir_name)) return $dir_size;
    
    if ($dh = opendir($dir_name)) {
        while (($file = readdir($dh)) !== false) {
            if($file !='.' && $file != '..'){
                if(is_file($dir_name.'/'.$file)){
                    $dir_size += filesize($dir_name.'/'.$file);
                }
                // check for any new directory inside this directory
                if(is_dir($dir_name.'/'.$file)){
                    $dir_size +=  getDirSize($dir_name.'/'.$file);
                }
            }
        }
    }
    closedir($dh);
    return $dir_size;    
}

Чтобы не использовать рекурсию, можно использовать RecursiveDirectoryIterator, который входит в состав Standard PHP Library (SPL). Наша функция тогда будет выглядеть так:

function getDirSize2($dir_name){
    
    $dir_size = 0;
    if (!is_dir($dir_name)) return $dir_size;
    
    $ite=new RecursiveDirectoryIterator($dir_name);
    foreach (new RecursiveIteratorIterator($ite) as $filename=>$cur)
        $dir_size+=$cur->getSize();

    return $dir_size;    
}

Но это еще не все, есть еще одно решение.

function getDirSize3($dir_name){
    
    $dir_size = 0;
    if (!is_dir($dir_name)) return $dir_size;
    if(strpos(PHP_OS, 'WIN') !== false){
        $obj = new COM ( 'scripting.filesystemobject' );
        if ( is_object ( $obj ) )
        {
            $ref = $obj->getfolder ( $dir_name );
            $dir_size = $ref->size;
            $obj = null;
        }
    }
    else{
        $io = popen ( '/usr/bin/du -sk ' . $dir_name, 'r' );
        $size = fgets ( $io, 4096);
        $dir_size = substr ( $size, 0, strpos ( $size, ' ') );
        pclose ( $io );
    }
    return $dir_size;    
}

Все эти функции возвращают количество байт в каталоге. Для преобразования байт в читаемый вид можно использовать эту функцию:

function format_size($size){
    
    $mod = 1024;
    $units = array('Б', 'КБ', 'МБ', 'ГБ', 'ТБ', 'ПБ');   
    for ($i = 0; $size > $mod; $i++)   
        $size /= $mod;

    return round($size, 2) . " " . $units[$i];
}

Использовать эти функции можно так:

$dir_name = dirname(__FILE__);

echo format_size(getDirSize($dir_name)).'<br />';

echo format_size(getDirSize2($dir_name)).'<br />';

echo format_size(getDirSize3($dir_name)).'<br />';

На этом все. Удачи!

Оцените эту статью:



Интересно почитать

    Получать новые материалы этого сайта на свой email адрес?

    Отправлять мне комментарии по эл. почте?

Простая CRM

Нашли ошибку в тексте

Система Orphus
https://biznesguide.ru/coding/184.html
4,18 из 5 на основе 8 оценок.