PHP:获取真实文件大小、字节单位转化

<?php
// 取消最大请求时间限制
set_time_limit(0);
// 调整最大内存限制:filesize()最大可正确读取2G文件,即2048M
ini_set('memory_limit', '2048M');
// 定义字节单位
define('UNITS', ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'ZB', 'YB', 'DB', 'NB']);
/**
 * 读取文件的真实字节数
 * @param string $file 文件路径
 * @return int
 */
function realsize(string $file){
  $file = fopen($file, 'r');
  $size = 0;
  // 内部数字是内存为'2048M'时的允许的字节数
  while (!feof($file)) $size += strlen(fread($file, 0x20000000));
  fclose($file);
  return $size;
}
/**
 * 在Windows系统中使用命令获取文件大小
 * 【注意】个人在Win10x64系统中测试为:11.4G的单文件大小耗时为0.067~0.165s
 * 【注意】如果存在不能获取到的情况,请各位根据执行命令后的数据做出兼容调整
 * 【优点】大文件时远比分流读取快速、不用调整内存大小
 * @param string $file 文件路径
 * @return string 正整数
 */
function realsizeByWindows(string $file){
  $data = [];
  // 在路径两边加双引号是防止空格字符的影响
  exec('dir /s "' . strtr($file, '/', '\\').'"', $data);
  foreach ($data as $v) {
    $v = trim($v);
    if (substr($v, 0, 9) === '1 File(s)') {
      preg_match('/\d+/', str_replace(',', '', substr($v, 9)), $m);
      return $m[0];
    }
  }
}
/**
 * 按数字转为对应的字节单位
 * @param string $size 字节数量
 * @param integer $length 保留的小数位数
 * @return string
 */
function unit(string $size, int $length = 0){
  foreach (UNITS as $v) {
    if ($size >= 1024) $size = bcdiv($size, '1024', $length);
    else break;
  }
  return $size . $v;
}

【注意】

1.部分浏览器有最大请求时间限制,会导致"set_time_limit(0)"无效,所以建议在命令窗口中执行,执行方法为:将"php.exe"的文件路径写入到系统的环境变量"path"中,然后打开命令窗口,输入"php php的文件路径",例如:"php C:\www\test.php"。

2.获取文件真实大小均可采用命令行获取的方式。已知windows系统中为=dir /s "文件路径",且文件路径分隔符必须是"\"。其它运行环境请自行测试!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值