计算php中目录(文件夹)的权重

Calculate the weight of a directory (folder) in php

我想计算 php 中目录的权重,然后按照下面的示例显示数据。

Example:

Storage
50 GB (14.12%) of 353 GB used

我有以下功能,我用它在列表中显示根目录中的文件夹。

<?php

    $dir = ('D:\data');
    echo "Size : " Fsize($dir);
    function Fsize($dir)
        {
            if (is_dir($dir))
                {
                    if ($gd = opendir($dir))
                        {
                            $cont = 0;
                            while (($file = readdir($gd)) !== false)
                                {
                                    if ($file != "." && $file != ".." )
                                        {
                                            if (is_dir($file))
                                                {
                                                    $cont += Fsize($dir."/".$file);
                                                }
                                            else
                                                {
                                                    $cont += filesize($dir."/".$file);
                                                    echo  "file : " . $dir."/".$file . "&nbsp;&nbsp;" . filesize($dir."/".$file)."<br />";
                                                }
                                        }
                                }
                            closedir($gd);
                        }
                }
            return $cont;
        }

?>

它显示的文件夹大小是 3891923,但它不是实际大小,在验证目录时实际大小是 191791104 bytes

你能帮帮我吗?

您在此处对目录的测试不正确:

if (is_dir($file))   // This test is missing the directory component
     {
     $cont += Fsize($dir."/".$file);
     }
else

尝试:

if (is_dir("$dir/$file"))   // This test adds the directory path
     {
     $cont += Fsize($dir."/".$file);
     }
else

PHP 提供了许多 iterators 可以简化这样的操作:

$path = "path/to/folder";
$Directory = new RecursiveDirectoryIterator($path);
$Iterator = new RecursiveIteratorIterator($Directory);
$Iterator->setFlags(FilesystemIterator::SKIP_DOTS);

$totalFilesize = 0;
foreach($Iterator as $file){
    if ($file->isFile()) {
        $totalFilesize += $file->getSize();
    }
}

echo "Total: $totalFilesize";