为了账号安全,请及时绑定邮箱和手机立即绑定

如何在PHP中获取目录大小

如何在PHP中获取目录大小

PHP
泛舟湖上清波郎朗 2019-10-25 11:09:26
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>';}php disk_total_space在脚本执行完成之前,为什么处理器使用率会过高或100%升高?可以做些什么来优化它吗?还是有其他方法可以检查文件夹和其中的文件夹大小?
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

以下是其他地方提供的其他解决方案:


如果在Windows主机上:


<?

    $f = 'f:/www/docs';

    $obj = new COM ( 'scripting.filesystemobject' );

    if ( is_object ( $obj ) )

    {

        $ref = $obj->getfolder ( $f );

        echo 'Directory: ' . $f . ' => Size: ' . $ref->size;

        $obj = null;

    }

    else

    {

        echo 'can not create object';

    }

?>

否则,如果在Linux主机上:


<?

    $f = './path/directory';

    $io = popen ( '/usr/bin/du -sk ' . $f, 'r' );

    $size = fgets ( $io, 4096);

    $size = substr ( $size, 0, strpos ( $size, "\t" ) );

    pclose ( $io );

    echo 'Directory: ' . $f . ' => Size: ' . $size;

?>


查看完整回答
反对 回复 2019-10-25
?
森栏

TA贡献1810条经验 获得超5个赞

function GetDirectorySize($path){

    $bytestotal = 0;

    $path = realpath($path);

    if($path!==false && $path!='' && file_exists($path)){

        foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)) as $object){

            $bytestotal += $object->getSize();

        }

    }

    return $bytestotal;

}

与詹妮丝·金塔纳(Janith Chinthana)提出的想法相同。有一些修复:


转换$path为realpath

仅当路径有效且文件夹存在时才执行迭代

跳过.和..文件

性能优化


查看完整回答
反对 回复 2019-10-25
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

一个纯PHP的例子。


<?php

    $units = explode(' ', 'B KB MB GB TB PB');

    $SIZE_LIMIT = 5368709120; // 5 GB

    $disk_used = foldersize("/webData/users/vdbuilder@yahoo.com");


    $disk_remaining = $SIZE_LIMIT - $disk_used;


    echo("<html><body>");

    echo('diskspace used: ' . format_size($disk_used) . '<br>');

    echo( 'diskspace left: ' . format_size($disk_remaining) . '<br><hr>');

    echo("</body></html>");



function foldersize($path) {

    $total_size = 0;

    $files = scandir($path);

    $cleanPath = rtrim($path, '/'). '/';


    foreach($files as $t) {

        if ($t<>"." && $t<>"..") {

            $currentFile = $cleanPath . $t;

            if (is_dir($currentFile)) {

                $size = foldersize($currentFile);

                $total_size += $size;

            }

            else {

                $size = filesize($currentFile);

                $total_size += $size;

            }

        }   

    }


    return $total_size;

}



function format_size($size) {

    global $units;


    $mod = 1024;


    for ($i = 0; $size > $mod; $i++) {

        $size /= $mod;

    }


    $endIndex = strpos($size, ".")+3;


    return substr( $size, 0, $endIndex).' '.$units[$i];

}


?>


查看完整回答
反对 回复 2019-10-25
  • 3 回答
  • 0 关注
  • 685 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信