Подсчет занятого места в каталоге на PHP
Приветствую тебя, дорогой читатель блога 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 />';
На этом все. Удачи!
-
Комментарии (0)
- Сайт