获取人类可读文件大小的极其简单的函数。
<?php
function human_filesize($bytes, $decimals = 2) {
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
filesize — 获取文件大小
filename
文件路径。
返回文件大小(以字节为单位),如果发生错误,则返回 false
(并生成级别为 E_WARNING
的错误)。
注意: 由于 PHP 的整数类型是有符号的,并且许多平台使用 32 位整数,因此对于大于 2GB 的文件,一些文件系统函数可能会返回意外的结果。
发生故障时,将发出 E_WARNING
。
示例 #1 filesize() 示例
<?php
// 输出例如 somefile.txt: 1024 bytes
$filename = 'somefile.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';
?>
注意: 此函数的结果被缓存。有关详细信息,请参阅 clearstatcache()。
获取人类可读文件大小的极其简单的函数。
<?php
function human_filesize($bytes, $decimals = 2) {
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>
如果你最近在文件末尾添加了一些内容,然后关闭了文件,那么这种方法将不会显示添加的数据
<?php
// 将文件内容放入一个字符串中
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
你应该在调用 filesize() 之前插入对 clearstatcache() 的调用
我花了两个小时才找到这个 =/
<?php
// 恢复所有大于 > 4GB 的文件大小。
// 在 php 32bits 和 64bits 上工作,并支持 linux
// 使用了 com_dotnet 扩展
function getSize($file) {
$size = filesize($file);
if ($size <= 0)
if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) {
$size = trim(`stat -c%s $file`);
}
else{
$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($file);
$size = $f->Size;
}
return $size;
}
?>
<?php
/**
* 将字节转换为人类可读的文件大小。
*
* @param string $bytes
* @return string 人类可读的文件大小 (2,87 Мб)
* @author Mogilev Arseny
*/
function FileSizeConvert($bytes)
{
$bytes = floatval($bytes);
$arBytes = array(
0 => array(
"UNIT" => "TB",
"VALUE" => pow(1024, 4)
),
1 => array(
"UNIT" => "GB",
"VALUE" => pow(1024, 3)
),
2 => array(
"UNIT" => "MB",
"VALUE" => pow(1024, 2)
),
3 => array(
"UNIT" => "KB",
"VALUE" => 1024
),
4 => array(
"UNIT" => "B",
"VALUE" => 1
),
);
foreach($arBytes as $arItem)
{
if($bytes >= $arItem["VALUE"])
{
$result = $bytes / $arItem["VALUE"];
$result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"];
break;
}
}
return $result;
}
?>
来自 rommel at rommelsantor dot com 的函数经过略微修改,现在它返回两位字符的文件大小,更便于阅读。
<?php
function human_filesize($bytes, $decimals = 2) {
$factor = floor((strlen($bytes) - 1) / 3);
if ($factor > 0) $sz = 'KMGT';
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor - 1] . 'B';
}
print human_filesize(12, 0); // 12B
print human_filesize(1234567890, 4); // 1.1498GB
print human_filesize(123456789, 1); // 117.7MB
print human_filesize(12345678901234, 5); // 11.22833TB
print human_filesize(1234567, 3); // 1.177MB
print human_filesize(123456); // 120.56KB
?>
我移除了 P 单位,因为 strlen 对大于 14 位的整数似乎不起作用。虽然这可能只是我的系统限制。
这个函数也可以用于控制浏览器缓存。例如,你有一个样式表,并且想要确保每个人都拥有最新版本。你可以每次编辑它时重命名它,但这会浪费时间。相反,你可以这样做
<?php
echo '<link rel="stylesheet" href="style.css?ver=1.'.filesize(dirname(__FILE__).'/style.css').'.'.filemtime(dirname(__FILE__).'/style.css').'.0">';
?>
示例输出
<link rel="stylesheet" href="style.css?ver=1.8824.1499869132.0">
这也可以应用于具有相同名称的 JS 和图像。
<?php
/**
* 返回文件大小(即使对于文件 > 2 Gb)
* 对于文件大小超过 PHP_INT_MAX (2 147 483 647),PHP 的 filesize 函数会从 -PHP_INT_MAX 循环到 PHP_INT_MAX。
*
* @param string $path 文件路径
* @return mixed 文件大小或错误时返回 false
*/
function realFileSize($path)
{
if (!file_exists($path))
return false;
$size = filesize($path);
if (!($file = fopen($path, 'rb')))
return false;
if ($size >= 0)
{// 检查它是否真的是一个小文件 (< 2 GB)
if (fseek($file, 0, SEEK_END) === 0)
{// 它真的是一个小文件
fclose($file);
return $size;
}
}
// 快速跳过前 2 GB 使用 fseek。之后,fseek 在 32 位 php 上不起作用(它在内部使用 int)
$size = PHP_INT_MAX - 1;
if (fseek($file, PHP_INT_MAX - 1) !== 0)
{
fclose($file);
return false;
}
$length = 1024 * 1024;
while (!feof($file))
{// 读取文件直到结束
$read = fread($file, $length);
$size = bcadd($size, $length);
}
$size = bcsub($size, $length);
$size = bcadd($size, strlen($read));
fclose($file);
return $size;
}
第一个给出的例子可能会让人以为这个函数可以使用本地文件名,例如 $fs = filesize("error_log"),但是如果你手动删除了一些文本,然后保存并关闭文件,下次你检查 filesize("error_log") 时,它将返回原始值,因为该值出于性能原因被缓存。如果你不知道这一点,它看起来就像一个讨厌的 bug。
因此,每个人都告诉你插入 clearstatcache(),它应该清除缓存的值并允许你检索当前的文件大小,但它仍然什么也不做,看起来就像另一个 bug!
但是,我发现如果你始终指定完整路径
例如 $fs = filesize("/user/some/path/error_log");
那么就不需要 clearstatcache() 了。
// 最佳的将负数转换为文件大小的方法。
// 不适用于大于 4GB 的文件
//
// 特别针对 32 位系统。限制转换文件大小为 4GB 或
// 4294967296。为什么我们会得到负数?因为文件的
// 指针必须与 PHP MAX 值 2147483647 配合工作。
// 文件偏移量:0, 1, 2, 3, ... 2147483647 = 2GB
// 要继续向上达到 4GB,会使用负数
// 因此,在 2147483647 之后,我们将得到 -2147483647
// -2147483647, -2147483646, -2147483645, -2147483644 ... 0 = 4GB
// 因此 0, 2147483647 和 -2147483647 到 0。全部完成 4GB = 4294967296
// 第一个偏移量为 0,最后一个偏移量为 4GB 的 0 应该添加到
// 计算中,因此字节的准确数量需要 "+ 2"。
<?php
function filsize_32b($file) {
$filez = filesize($file);
if($filez < 0) { return (($filez + PHP_INT_MAX) + PHP_INT_MAX + 2); }
else { return $filez; }
}
?>
对于大于 2 GB 的文件,请使用我的名为 Big File Tools 的库。 https://github.com/jkuchar/BigFileTools. 在 stackoverflow 上了解更多信息: http://stackoverflow.com/a/35233556/631369
获取远程文件大小最简单、最有效的实现
<?php
function remote_filesize($url) {
static $regex = '/^Content-Length: *+\K\d++$/im';
if (!$fp = @fopen($url, 'rb')) {
return false;
}
if (
isset($http_response_header) &&
preg_match($regex, implode("\n", $http_response_header), $matches)
) {
return (int)$matches[0];
}
return strlen(stream_get_contents($fp));
}
?>
此函数在 32 位操作系统上返回大于 2 GB 文件的准确文件大小
<?php
function file_get_size($file) {
// 打开文件
$fh = fopen($file, "r");
// 声明一些变量
$size = "0";
$char = "";
// 将文件指针设置为 0;我有点偏执,你可以删除它
fseek($fh, 0, SEEK_SET);
// 将乘数设置为零
$count = 0;
while (true) {
// 在文件中跳过 1 MB
fseek($fh, 1048576, SEEK_CUR);
// 检查我们是否真的离开了文件
if (($char = fgetc($fh)) !== false) {
// 如果没有,继续
$count ++;
} else {
// 否则跳回到我们离开之前的位置并退出循环
fseek($fh, -1048576, SEEK_CUR);
break;
}
}
// 我们能够进行 $count 次跳跃,因此文件至少有 $count * 1.000001 MB 大
// 1048577 因为我们跳过了 1 MB,并且 fgetc 也向前移动了 1 B
$size = bcmul("1048577", $count);
// 现在计算最后几个字节;它们总是小于 1048576,因此速度很快
$fine = 0;
while(false !== ($char = fgetc($fh))) {
$fine ++;
}
// 并添加它们
$size = bcadd($size, $fine);
fclose($fh);
return $size;
}
?>
这是我获得大于 2GB 文件的超快方法,该方法可以在任何版本的 Windows 上输出正确的字节大小,适用于 32 位和 64 位系统。
<?php
function find_filesize($file)
{
if(substr(PHP_OS, 0, 3) == "WIN")
{
exec('for %I in ("'.$file.'") do @echo %~zI', $output);
$return = $output[0];
}
else
{
$return = filesize($file);
}
return $return;
}
// 用法:find_filesize("路径");
// 示例:
echo "文件大小为:".find_filesize("D:\Server\movie.mp4")."";
?>
此函数快速计算目录的大小
http://aidanlister.com/repos/v/function.dirsize.php
你可以使用以下方法将文件大小转换为人类可读的大小
http://aidanlister.com/repos/v/function.size_readable.php
对于更快的(仅限 Unix)实现,请参阅 function.disk-total-space,注释 #34100
https://php.net/manual/en/function.disk-total-space.php#34100
这篇维基百科文章也很有意思,它讨论了千字节 (1000) 和 kibibyte (1024) 之间的区别。
http://en.wikipedia.org/wiki/Bytes
在 Windows 10 下,filesize 显然无法使用相对路径名。请改用绝对路径。 $size = filesize(".\\myfile.txt"); 对我来说不起作用,而 "d:\\MyFiles\\Myfile.txt" 可以。is_file() 或 stat() 等类似函数也适用。除非提供绝对路径,否则它们将无法正常工作。
这是一个以人类理解的方式获取文件大小的函数,带小数分隔符、千位分隔符、小数位数等。
function convertFileSize($file, $size=null, $decimals=2, $dec_sep='.', $thousands_sep=','){
if (!is_file($file)){
return "El fichero no existe";
}
$bytes = filesize($file);
$sizes = 'BKMGTP';
if (isset($size)){
$factor = strpos($sizes, $size[0]);
if ($factor===false){
return "El tamaño debe ser B, K, M, G, T o P";
}
} else {
$factor = floor((strlen($bytes) - 1) / 3);
$size = $sizes[$factor];
}
return number_format($bytes / pow(1024, $factor), $decimals, $dec_sep, $thousands_sep).' '.$size;
}
来源:http://softontherocks.blogspot.com/2014/11/obtener-el-tamano-de-un-fichero-y.html
<?php
function getSizeFile($url) {
if (substr($url,0,4)=='http') {
$x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
if ( strcasecmp($x[0], 'HTTP/1.1 200 OK') != 0 ) { $x = $x['content-length'][1]; }
else { $x = $x['content-length']; }
}
else { $x = @filesize($url); }
return $x;
}
?>
如果你在服务器中有重定向(比如 .htaccess 中的 Redirect Permanent)
在这种情况下,我们例如有
[content-length] => Array
(
[0] => 294 // 请求文件的尺寸
[1] => 357556 // 重定向文件的实际尺寸
)
// 使用 Windows 10 命令 dir 提取文件大小
// 适用于所有 32/64 位系统,并为虚拟文件提供最佳兼容性
// 但不能以 (int) 返回值,为了最佳返回值请使用 Float
<?php
filesize_dir("d:\\test.mkv"); //11.5GB => 返回 (float) 12401880207
function filesize_dir($file) {
exec('dir ' . $file, $inf);
$size_raw = $inf[6];
$size_exp = explode(" ",$size_raw);
$size_ext = $size_exp[19];
$size_int = (float) str_replace(chr(255), '', $size_ext);
return $size_int;
}
?>
// 使用 Windows 系统获取文件大小
// 最适合 php 32 位或 php 64 位
// 我不知道它是否适用于其他 Windows 系统,但在 Windows 10 上运行良好
<?php
echo filesize_cmd('c:\\', 'log.txt'); // 返回 1135
function filesize_cmd($folder, $file) {
return exec('forfiles /p '.$folder.' /m "'.$file.'" /c "cmd /c echo @fsize"');
}
?>
我创建了一个方便的函数,使用了来自 kaspernj at gmail dot com 和 md2perpe at gmail dot com 的代码片段,它应该能够获取 Windows、Linux 和 Mac(至少)上的大于 4GB 的文件大小。
<?php
函数 getSize($file) {
$size = filesize($file);
if ($size < 0)
if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'))
$size = trim(`stat -c%s $file`);
else{
$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($file);
$size = $file->Size;
}
return $size;
}
?>
在 32 位 PHP 上,用于确定大型文件 (>2GB) 实际文件大小的快速实现
function RealFileSize($fp)
{
$pos = 0;
$size = 1073741824;
fseek($fp, 0, SEEK_SET);
while ($size > 1)
{
fseek($fp, $size, SEEK_CUR);
if (fgetc($fp) === false)
{
fseek($fp, -$size, SEEK_CUR);
$size = (int)($size / 2);
}
else
{
fseek($fp, -1, SEEK_CUR);
$pos += $size;
}
}
while (fgetc($fp) !== false) $pos++;
return $pos;
}
输入是一个打开的文件句柄。返回值是文件大小 < 4GB 的整数,否则是浮点数。
它首先以每次约 1GB 的速度跳过,读取一个字符,然后重复。当它进入最后一个 GB 时,它会在读取失败时将大小减半。最后几个字节只是读入的。
有些人可能对这个函数有顾虑,因为 $pos 在超过整数限制后会变成浮点数,而且他们知道浮点数的精度往往很低。在大多数正确实现 IEEE 浮点数规范的计算机上,$pos 的精度可以达到大约 9 *拍字节*。除非您在 PHP 中使用多拍字节文件,或者代码在奇怪的硬件上执行,否则这个函数将绰绰有余。此函数的每个部分都经过精心设计,以应对 32 位的缺陷。
<?php
// Windows 的文件大小
// 如果 filesize() php > PHP_INT_MAX (4 294 967 296) :: 失败
// filesize_cmd 返回 Windows 测量的值
函数 filesize_cmd($file) {
$pth = pathinfo($file);
$fz = filesize($file);
$fx = exec('forfiles /p ' . $pth['dirname'] . ' /m "' . $pth['basename'] . '" /c "cmd /c echo @fsize"');
if($fz != $fx) { return $fx; }
return $fz;
}
?>
function dir_size($file) {
// 在 win 7x64 php 5.4 上测试
exec('dir /s /a "' . $file.'"', $inf);
$r=explode(' ',$inf[count($inf)-2]);
$rr = preg_replace('~[^\d]+~','',$r[count($r)-2]);
return $rr;
}
我有一个运行的 CLI 脚本,它在 ssh2_sftp 连接上使用 filesize 函数。它存在 >2Gb 的限制问题,而它在本地不存在该问题。我通过 ssh2_shell 执行 “du -sb” 命令成功解决了这个问题。
以下函数以 ssh2_connect 资源和路径作为输入。它可能并不整洁,但它暂时解决了问题。
<?php
函数 fSSHFileSize($oConn, $sPath) {
if(false !== ($oShell = @ssh2_shell($oConn, 'xterm', null, 500, 24, SSH2_TERM_UNIT_CHARS))) {
fwrite($oShell, "du -sb '".$sPath."'".PHP_EOL);
sleep(1);
while($sLine = fgets($oShell)) {
flush();
$aResult[] = $sLine;
}
fclose($oShell);
$iSize = 0;
if(count($aResult) > 1) {
$sTemp = $aResult[count($aResult)-2];
$sSize = substr($sTemp, 0, strpos($sTemp, chr(9)));
if(is_numeric(trim($sSize))) {
$iTemp = (int)$sSize;
if($iTemp > "2000000000") $iSize = $iTemp;
}
}
return $iSize;
}
return 0;
}
?>
在 64 位平台上,这对于获取 > 4GB 文件的文件大小非常可靠
<?php
$a = fopen($filename, 'r');
fseek($a, 0, SEEK_END);
$filesize = ftell($a);
fclose($a);
?>
这是我发现的获取远程文件大小的最佳方法。请注意,HEAD 请求不会获取请求的实际主体,它们只是检索标头。因此,对 100MB 资源发出 HEAD 请求所花费的时间与对 1KB 资源发出 HEAD 请求所花费的时间相同。
<?php
$remoteFile = 'http://us.php.net/get/php-5.2.10.tar.bz2/from/this/mirror';
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 除非文件重定向(例如我们正在使用的 PHP 示例),否则没有必要
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
echo 'cURL 失败';
exit;
}
$contentLength = '未知';
$status = '未知';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
$status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
}
echo 'HTTP 状态:' . $status . "\n";
echo '内容长度:' . $contentLength;
?>
结果
HTTP 状态:302
内容长度:8808759
这是获取大型文件 > 2Gb 在 32 位和 64 位平台上大小的非常快速且可靠的方法。
<?php
/**
* 获取文件大小,与平台和架构无关。
* 此函数支持 32 位和 64 位架构,并适用于大于 2 GB 的大文件
* 返回值的类型取决于平台/架构:当 PHP_INT_SIZE < 8 时为 (float),否则为 (int)
* @param resource $fp
* @return mixed (int|float) 成功时的文件大小,或 (bool) FALSE 表示错误
*/
function my_filesize($fp) {
$return = false;
if (is_resource($fp)) {
if (PHP_INT_SIZE < 8) {
// 32 位
if (0 === fseek($fp, 0, SEEK_END)) {
$return = 0.0;
$step = 0x7FFFFFFF;
while ($step > 0) {
if (0 === fseek($fp, - $step, SEEK_CUR)) {
$return += floatval($step);
} else {
$step >>= 1;
}
}
}
} elseif (0 === fseek($fp, 0, SEEK_END)) {
// 64 位
$return = ftell($fp);
}
}
return $return;
}
?>
<?php
// 快速示例,用于测试返回值,以便将 0 字节文件与 filesize() 函数调用失败区分开来
$size = filesize("some.file");
if ($size === FALSE) {
echo "filesize 不可用";
} else {
echo "some.file 长度为 $size 字节";
}
// 更短的版本,略有不同
if ( ($size = filesize("some.file")) !== FALSE)
echo "some.file 长度为 $size 字节";
?>
这是我之前 filesize2bytes 的更新版本。
现在返回值确实是 int 类型。
<?php
/**
* 将人类可读的文件大小(例如 10 MB、200.20 GB)转换为字节。
*
* @param string $str
* @return int 结果以字节为单位
* @author Svetoslav Marinov
* @author http://slavi.biz
*/
function filesize2bytes($str) {
$bytes = 0;
$bytes_array = array(
'B' => 1,
'KB' => 1024,
'MB' => 1024 * 1024,
'GB' => 1024 * 1024 * 1024,
'TB' => 1024 * 1024 * 1024 * 1024,
'PB' => 1024 * 1024 * 1024 * 1024 * 1024,
);
$bytes = floatval($str);
if (preg_match('#([KMGTP]?B)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
$bytes *= $bytes_array[$matches[1]];
}
$bytes = intval(round($bytes, 2));
return $bytes;
}
?>
对之前帖子的评论和修改。
根据 RFC,使用 HTTP/1.1 时,您的请求(无论是 GET、POST 还是 HEAD)必须包含 Host 头字符串,而 HTTP/1.0 不需要 Host 头。但是,无法确定您的远程服务器如何处理请求,因此您可以始终添加 Host(这对于 HTTP/1.0 来说不会是错误)。
host 值 _必须_ 是主机名(而不是 CNAME 和 IP 地址)。
此函数捕获包含 Location 头的响应,并递归地向我们被移动到的主机发送 HEAD 请求,直到遇到最终响应。
(当从 php 脚本或使用 apache mod_rewrite 的一些哈希链接下载内容时,您经常会遇到这种重定向。几乎所有下载大师都能正确处理 302 重定向,因此此代码也能做到(递归地通过 302 重定向)。)
[$counter302] 指定如果遇到重定向,您允许此函数跳转多少次。如果初始限制(默认值为 5)过期,它将返回 0(应该根据您的目的进行修改)。
ReadHeader() 函数在之前的帖子中列出。
(参数描述也在那里。)
<?php
function remote_filesize_thru( $ipAddress, $url, $counter302 = 5 )
{
$socket = fsockopen( "10.233.225.2", 8080 );
if( !$socket )
{
// 无法打开 TCP 套接字连接
// 在这里执行一些合理的操作,而不是直接退出。
echo "<br>无法为 [$ipAddress] 打开套接字";
exit();
}
// 只发送 HEAD 请求到服务器
$head = "HEAD $url HTTP/1.0\r\nConnection: Close\r\n\r\n";
// 您可以使用 HTTP/1.1,但您的请求头字符串必须包含 "Host: " 头
fwrite( $socket, $head );
// 读取响应头
$header = ReadHeader( $socket );
if( !$header )
{
// 在这里根据您的需要处理空响应...
Header( "HTTP/1.1 404 Not Found" );
exit();
}
fclose( $socket );
// 检查 "Location" 头
$locationMarker = "Location: ";
$pos = strpos( $header, $locationMarker );
if( $pos > 0 )
{
$counter302--;
if( $counter302 < 0 )
{
// 重定向限制(默认 5 次)已过期 - 在这里返回警告或执行一些合理的操作
echo "警告:重定向序列过长";
return 0;
}
// Location 存在 - 我们应该确定目标主机并转移到那里,就像任何下载大师所做的那样...
// 这里不需要使用正则表达式
$end = strpos( $header, "\n", $pos );
$location = trim( substr( $header, $pos + strlen( $locationMarker ), $end - $pos - strlen( $locationMarker ) ), "\\r\\n" );
// 提取纯主机(没有 "http://")
$host = explode( "/", $location );
$ipa = gethostbyname( $host[2] );
// 移动到 Location
return remote_filesize_thru( $ipa, $location, $counter302 );
}
// 尝试获取响应中的 Content-Length
$regex = '/Content-Length:\s([0-9].+?)\s/';
$count = preg_match($regex, $header, $matches);
// 如果存在 Content-Length 字段,它的值
// 现在将在 $matches[1] 中
if( isset( $matches[1] ) )
$size = $matches[1];
else
$size = 0;
return $size;
}
?>
我用来计算目录大小的解决方案
<?php
/**
* 获取目录大小
* @param directory $directory
* @return integer
*/
function dirSize($directory) {
$size = 0;
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
$size+=$file->getSize();
}
return $size;
}
?>
"注意:由于 PHP 的整数类型是有符号的,并且许多平台使用 32 位整数,因此对于大于 2GB 的文件,一些文件系统函数可能会返回意外的结果。"
这应该是一个警告,而不是一个说明:正如其他一些评论所建议的,filesize 对于需要对大文件采取自定义操作的应用程序是无用的。
一个简单且改进的函数,用于获取包括子文件夹在内的文件夹大小
<?php
function folderSize ($dir)
{
$size = 0;
$contents = glob(rtrim($dir, '/').'/*', GLOB_NOSORT);
foreach ($contents as $contents_value) {
if (is_file($contents_value)) {
$size += filesize($contents_value);
} else {
$size += realFolderSize($contents_value);
}
}
return $size;
}
echo folderSize('/var/www/html/').' bytes';
?>
使用 fseek 速度非常慢。这个更好更快。
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$size = trim(exec("for %F in (\"" . $file . "\") do @echo %~zF"));
}
elseif ((PHP_OS == 'Linux') || (PHP_OS == 'FreeBSD') || (PHP_OS == 'Unix') || (PHP_OS == 'SunOS')) {
$size = trim(shell_exec("stat -c%s " . escapeshellarg($file)));
} else {
$size = filesize($file);
}
这是对 Rommel(rommel at rommelsantor dot com)编写的函数的改进。PHP 5.4+ 兼容性和对数字后面要写什么单词的微小计算。
<?php
function human_filesize($bytes, $decimals = 2) {
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
$d = (empty($factor))?0:$decimals;
return sprintf("%.{$d}f", $bytes / pow(1024, $factor)) . " ". ((!empty($factor))?@$sz[(int)$factor]:"")."o";
}
?>