Розмір теки

До уваги надається функція, яка визначає розмір теки з усіма входженнями піддеректорій в байтах і функція для перерахунку їх в кіло- мега- і гіга- байти. Вона рекурсивно обходить вкладені директорії, що забезпечує точний розрахунок.

<?php
/**
 * Виводить розмір папки 'zip' у форматованому вигляді.
 */

// Шлях до цільової директорії
$targetFolder = __DIR__ . DIRECTORY_SEPARATOR . 'zip';

// Перевірка доступності директорії
if (!is_readable($targetFolder)) {
    echo '<blockquote><span class="error">Error: Folder not accessible.</span></blockquote>';
    exit;
}

// Розрахунок розміру та форматування
$rawSize = sizeFolder($targetFolder);
$formattedSize = sizeFormat($rawSize);

// Вивід результату з семантичним HTML
echo <<<HTML
<blockquote>
  Folder for calculation: <span class="pad10">ZIP</span>
  <span class="pad30-l"><code>Size: {$formattedSize}</code></span>
</blockquote>
HTML;

/**
 * Рекурсивно обчислює розмір директорії в байтах
 */
function sizeFolder(string $dir): int
{
    $size = 0;
    $items = glob(rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*', GLOB_NOSORT);

    if ($items === false) {
        return 0; // Уникнення warning при недоступності
    }

    foreach ($items as $item) {
        if (is_file($item)) {
            $size += filesize($item);
        } elseif (is_dir($item)) {
            $size += sizeFolder($item); // Рекурсивний виклик
        }
    }

    return $size;
}

/**
 * Форматує байти у зручні одиниці (KB, MB, ...)
 */
function sizeFormat($bytes): string
{
    $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
    $i = 0;

    while ($bytes >= 1024 && $i < count($units) - 1) {
        $bytes /= 1024;
        $i++;
    }

    return round($bytes, 2) . ' ' . $units[$i];
}
?>

Folder for calculation: ZIP

Size: 430.38 KB

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

/*
* Обхід всіх файлів у папці
*/

function read_all ($dir){
    if(!is_dir($dir)) return false; 
    $handle = opendir($dir);
    if($handle){
        while(($fl = readdir($handle)) !== false){
            $temp = iconv('GBK','utf-8',$dir.DIRECTORY_SEPARATOR.$fl); // конвертується в utf-8 формат
            if(is_dir($temp) && $fl!='.' && $fl != '..'){
                echo 'Фолдер: ' . $temp. '<br>';
                read_all($temp);
            }else{
                if($fl!='.' && $fl != '..'){

                    echo 'Файл: '.$temp.'<br>';
                }
            }
        }
    }
}

echo "<blockquote>";
	read_all(__DIR__ );
echo "</blockquote>";

Ну й на цьому все сьогодні.