php disk_total_space - PullRequest
       8

php disk_total_space

2 голосов
/ 21 января 2009

Мне нужна помощь с функцией disk_total_space ..

У меня есть это в моем коде

<?php
          $sql="select * from users order by id";
          $result=mysql_query($sql);
          while($row=mysql_fetch_array($result)) {
?>
Name : <?php echo $row['name']; ?>
Email : <?php echo $row['email']; ?>
Diskspace Available : <?php 
$dir = "C:/xampp/htdocs/freehosting/".$row['name'];
disk_total_space($dir);
} ?>

Однако это возвращает мне одинаковое дисковое пространство для каждого пользователя ..

Кто-нибудь может пролить мне свет?

спасибо:)

Ответы [ 5 ]

5 голосов
/ 21 января 2009

http://us2.php.net/disk_total_space говорит,

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

Вы, вероятно, видите общее пространство C:

Альтернативные решения существуют как для Windows, так и для Linux .

3 голосов
/ 21 января 2009

Я думаю, что вы хотите что-то вроде этого:

function foldersize($path) {
    $total_size = 0;
    $files = scandir($path);

    foreach($files as $t) {
        if (is_dir(rtrim($path, '/') . '/' . $t)) {
            if ($t<>"." && $t<>"..") {
                $size = foldersize(rtrim($path, '/') . '/' . $t);
                $total_size += $size;
            }
        } else {
            $size = filesize(rtrim($path, '/') . '/' . $t);
            $total_size += $size;
        }   
    }
    return $total_size;
}

function format_size($size) {
    $mod = 1024;

    $units = explode(' ','B KB MB GB TB PB');
    for ($i = 0; $size > $mod; $i++) {
        $size /= $mod;
    }

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

$SIZE_LIMIT = 5368709120; // 5 GB
$sql="select * from users order by id";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)) {
    $disk_used = foldersize("C:/xampp/htdocs/freehosting/".$row['name']);
    $disk_remaining = $SIZE_LIMIT - $disk_used;
    print 'Name: ' . $row['name'] . '<br>';
    print 'diskspace used: ' . format_size($disk_used) . '<br>';
    print 'diskspace left: ' . format_size($disk_remaining) . '<br><hr>';
}

edit : в рекурсивной функции изначально была ошибка. Теперь он также должен читать папки внутри исходных папок и папки внутри этих папок и т. Д.

1 голос
/ 21 января 2009

Комментарии к функции на PHP.net, по-видимому, указывают на то, что это дает пространство диска / раздела, в котором находится $dir, а не размер $dir самого.

1 голос
/ 21 января 2009

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

$space_used=`du -sh $dir`;

-s суммирует весь каталог, -h возвращает результат в «человеческих» единицах, таких как MB и GB.

Редактировать: извинения, я пропустил, что это было на окнах. Оставим ответ на тот случай, если он поможет кому-то, ищущему подобную проблему. Для окон попробуйте это предложение в руководстве по PHP

0 голосов
/ 21 января 2009

Согласно документам для disk_total_space(), возвращаемое значение относится к файловой системе , в которой находится каталог . Не учитывается пространство, используемое в каталоге + его подкаталогах.

Вы можете выложить на du или для более портативного решения:

$total = 0;

foreach (new RecursiveDirectoryIterator($dir) as $entry)
{
    if ($entry->isFile())
        $total += $entry->getSize();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...