Эхо объединенный размер всех файлов - PullRequest
1 голос
/ 08 февраля 2011

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

Моя структура каталогов похожа на ...

загрузки -> клиент 01 -> другой клиент -> какой-то другой клиент

.. ЭСТ.

Каждая папка содержит различные файлы, поэтому мне нужен скрипт для просмотра каталога «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";
}
?>

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

Ответы [ 4 ]

3 голосов
/ 08 февраля 2011

Я бы использовал 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>';
1 голос
/ 08 февраля 2011

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

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;
}

РЕДАКТИРОВАТЬ была небольшая ошибка в коде, который я сейчас исправил

0 голосов
/ 08 февраля 2011

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

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

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

0 голосов
/ 08 февраля 2011

Попробуйте:

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

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

...