用于在PHP中获取文件大小的递归函数

时间:2015-12-22 12:06:34

标签: php filesystems

我正在开发一个PHP函数,它将扫描给定的文件夹并返回文件夹中所有文件的总大小。我的问题是,即使它适用于存储在该文件夹根目录中的文件,它也不适用于任何子文件夹中的文件。我的代码是:

function get_total_size($system)
{
    $size = 0;
    $path = scandir($system);
    unset($path[0], $path[1]);
    foreach($path as $file)
    {
        if(is_dir($file))
        {
            get_total_size("{$system}/{$file}");
        }
        else
        {
            $size = $size + filesize("{$system}/{$file}");
        }
    }
    $size = $size / 1024;
    return number_format($size, 2, ".", ",");
}    

我没有设置数组的第0个和第1个元素,因为这些是点和双点来上一个目录。任何帮助将不胜感激

4 个答案:

答案 0 :(得分:1)

您忘了计算子文件夹的大小。您必须将其添加到$size变量。

function get_total_size($system)
{
    $size = 0;
    $path = scandir($system);
    unset($path[0], $path[1]);
    foreach($path as $file)
    {
        if(is_dir($file))
        {
            $size += get_total_size("{$system}/{$file}"); // <--- HERE
        }
        else
        {
            $size = $size + filesize("{$system}/{$file}");
        }
    }
    return $size;
}    

但是这可能会产生问题,因为您正在使用number_format功能。我不会这样做,并在收到get_total_size函数的结果后添加格式。

答案 1 :(得分:1)

你可以使用递归目录迭代器。看看下面的解决方案:

<?php
$total_size = 0;
$di = new RecursiveDirectoryIterator('/directory/path');
foreach (new RecursiveIteratorIterator($di) as $filename => $file) {
   if($file->isFile()) {
        echo $filename . ' - ' . $file->getSize() . ' bytes <br/>';
        $total_size += $file->getSize();
    }
}

echo $total_size; //in bytes
?>

答案 2 :(得分:1)

您可以尝试此过程。当您检查此文件is_dir时,您还必须计算文件大小。当你检查is_dir时,你必须用root目录连接它,否则它会显示错误。

function get_total_size($system)
{
    $size = 0;
    $path = scandir($system);
    unset($path[0], $path[1]);
    foreach($path as $file)
    {
        if(is_dir($system.'/'.$file))
        {
            $size+=get_total_size("{$system}/{$file}");
        }
        else
        {
            $size = $size + filesize("{$system}/{$file}");
        }
    }
    $size = $size / 1024;
    return number_format($size, 2, ".", ",");
}  

我认为它会正常工作

快乐编码:)

答案 3 :(得分:0)

SELECT T.Name AS TableName, S.Row_count AS RecordsCount FROM sys.dm_db_partition_stats S INNER JOIN sys.tables T ON T.object_id = S.object_id Where Object_Name(S.Object_Id) IN ('Employees','Country') 系列课程对您有用。

recursiveIterator