Эхо объединить размер всех файлов

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

Моя структура каталогов подобна …

uploads -> client 01 -> другой клиент -> другой клиент

..ect.

Каждая папка содержит различные файлы, поэтому мне нужен сценарий, чтобы посмотреть каталог «uploads» и дать мне размер всех файлов и папок в сочетании.

<?php $total = 0; //Total File Size //Open the dir w/ opendir(); $filePath = "uploads/" . $_POST["USER_NAME"] . "/"; $d = opendir( $filePath ); //Or use some other path. if( $d ) { while ( false !== ( $file = readdir( $d ) ) ) { //Read the file list if (is_file($filePath.$file)){ $total+=filesize($filePath.$file); } } closedir( $d ); //Close the direcory echo number_format($total/1048576, 2); echo ' MB<br>'; } else { echo "didn't work"; } ?> 

Любая помощь будет оценена по достоинству.

    Я использую некоторую добротность SPL …

     $filePath = "uploads/" . $_POST["USER_NAME"]; $total = 0; $d = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($filePath), RecursiveIteratorIterator::SELF_FIRST ); foreach($d as $file){ $total += $file->getSize(); } echo number_format($total/1048576, 2); echo ' MB<br>'; 

    Самый простой способ – установить рекурсивную функцию

     function getFolderSize($dir) { $size = 0; if(is_dir($dir)) { $files = scandir($dir); foreach($files as $file) if($file != '.' && $file != '..') if(filetype($dir.DIRECTORY_SEPARATOR.$file) == 'dir') $size += getFolderSize($dir.DIRECTORY_SEPARATOR.$file); else $size += filesize($dir.DIRECTORY_SEPARATOR.$file); } return $size; } 

    EDIT была небольшая ошибка в коде, который я исправил сейчас

    найдите в нем каталог ключевых слов: http://php.net/manual/en/function.filesize.php У одного парня есть удивительная функция, которая вычисляет размер каталога там.

    в качестве альтернативы,
    вам может потребоваться рекурсия или цикл, если файл, который вы читаете, является каталогом.

    пройти через http://php.net/manual/en/function.is-dir.php

    Попробуй это:

     exec("du -s $filepath",$a); $size = (int)$a[0]; // gives the size in 1k blocks 

    Убедитесь, что вы подтвердили $_POST["USER_NAME"] хотя, может быть, вы $_POST["USER_NAME"] с неприятной ошибкой безопасности. (например, $_POST["USER_NAME"] = "; rm -r /*" )