【问题标题】:i want get the sum of files size in folder by php我想通过php获取文件夹中文件大小的总和
【发布时间】:2010-05-07 11:02:37
【问题描述】:

我有一个名为files 的文件夹,我如何确定它的文件大小总和?

【问题讨论】:

标签: php


【解决方案1】:

使用DirectoryIteratorSplFileInfo

$totalSize = 0;
foreach (new DirectoryIterator('/path/to/dir') as $file) {
    if ($file->isFile()) {
        $totalSize += $file->getSize();
    }
}
echo $totalSize;

如果您需要包含子文件夹:

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/dir')
);

$totalSize = 0;
foreach ($iterator as $file) {
    $totalSize += $file->getSize();
}
echo $totalSize;

您可以通过我们提供给format 6000 to 6k 的代码运行$totalSize,以获得更易于阅读的输出。不过,您必须将所有 1000 更改为 1024。

【讨论】:

  • 不错的答案 :) 使用它非常简单。谢谢你的回答
【解决方案2】:

在遍历所有文件和子目录文件时使用filesize() 来计算文件大小。

<?php
function get_dir_size($dir_name){
    $dir_size =0;
    if (is_dir($dir_name)) {
        if ($dh = opendir($dir_name)) {
           while (($file = readdir($dh)) !== false) {
              if($file !=”.” && $file != “..”){
                  if(is_file($dir_name.”/”.$file)){
                      $dir_size += filesize($dir_name.”/”.$file);
                  }
                 /* check for any new directory inside this directory */
                 if(is_dir($dir_name.”/”.$file)){
                     $dir_size +=  get_dir_size($dir_name.”/”.$file);
                  }
               }
           }
        }
    }
closedir($dh);
return $dir_size;
}

$dir_name = “directory name here”;
/* 1048576 bytes == 1MB */
$total_size= round((get_dir_size($dir_name) / 1048576),2) ;
print “Directory $dir_name size : $total_size MB”;
?>

【讨论】:

    【解决方案3】:
    echo array_sum(array_map('filesize', glob('*')));
    

    【讨论】:

    • 不排除目录,是吗?这也是低效的。首先,您将文件名全局化,然后用它们的大小替换它们,然后对它们求和。当您可以在一次迭代中完成所有操作时,这是对初始数组的两次额外迭代。
    • 另外,当您不关心文件顺序时,您可以添加GLOB_NOSORT。请参阅phparch.com/2010/04/28/putting-glob-to-the-test - 这应该会为 glob 增加一些速度。虽然仍然不是最佳的。
    • array_reduce(glob('?*.?*', GLOB_NOSORT), function($sum,$path){return $sum+filesize($path);}); 表示,使用 DirectoryIterator 或派生类更漂亮。
    【解决方案4】:

    如果您可以访问 exec 函数,则可以使用此代码:

    exec("du {directory_path_you_want_see_size} -s 2>&1",$output);
    echo intval($output[0]) ;
    

    示例:

    exec("du /home/ -s 2>&1",$output);
    echo intval($output[0]) ;
    

    【讨论】:

    • 请不要推荐使用exec(),尤其是当它涉及到任何类型的变量、用户提供的输入时。这只是为 shell 命令注入及其所有与安全相关的影响开辟了可能性,而且没有人真正想要这样。但是,如果无法避免,至少指向escapeshellarg() 或其他方式在将用户输入传递给exec() 之前对其进行清理。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 2020-02-01
    • 1970-01-01
    • 2014-03-01
    • 2021-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多