PHP Conference Japan 2024

filesize

(PHP 4, PHP 5, PHP 7, PHP 8)

filesize获取文件大小

描述

filesize(字符串 $filename): 整数|false

获取给定文件的大小。

参数

filename

文件路径。

返回值

返回文件大小(以字节为单位),或者在发生错误时返回 false(并生成 E_WARNING 级别错误)。

注意: 由于 PHP 的整数类型是有符号的,并且许多平台使用 32 位整数,因此对于大于 2GB 的文件,某些文件系统函数可能会返回意外的结果。

错误/异常

失败时,会发出 E_WARNING

示例

示例 #1 filesize() 示例

<?php

// 输出例如 somefile.txt: 1024 字节

$filename = 'somefile.txt';
echo
$filename . ': ' . filesize($filename) . ' 字节';

?>

注释

注意: 此函数的结果会被缓存。有关详细信息,请参阅 clearstatcache()

提示

从 PHP 5.0.0 开始,此函数也可以与某些 URL 封装器一起使用。请参阅 支持的协议和封装器 以确定哪些封装器支持 stat() 系列功能。

参见

添加注释

用户贡献注释 33 条注释

rommel at rommelsantor dot com
13 年前
获取人类可读文件大小的极其简单的函数。
<?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];
}
?>
匿名用户
13 年前
如果您最近向文件追加了一些内容,然后关闭了它,则此方法将不会显示追加的数据
<?php
// 将文件内容读取到字符串中
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
您应该在调用 filesize() 之前插入对 clearstatcache() 的调用
我花了两个小时才找到这个错误 =/
synnus at gmail dot com
7 年前
<?php

// 恢复所有大于 > 4GB 的文件大小。
// 在 php 32 位和 64 位上运行,并支持 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;
}
?>
evgenij at kostanay dot kz
8 年前
来自 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 单位,因为当整数长度超过 14 位时,strlen 似乎无法按预期工作。尽管这可能只是我系统的限制。
John Crocker
5 年前
给出的第一个示例可能让人误以为此函数可用于本地文件名,例如 $fs = filesize("error_log"),但如果手动删除一些文本,然后保存并关闭文件,则下次检查 filesize("error_log") 时,它将返回原始值,因为出于性能原因该值被缓存。如果您不知道这一点,它看起来就像一个讨厌的错误。

因此,每个人都告诉您插入 clearstatcache(),它应该清除缓存的值并允许您检索当前的文件大小,但它仍然不起作用,看起来像是另一个错误!

但是,我发现如果您始终指定完整路径
例如 $fs = filesize("/user/some/path/error_log");
那么甚至不需要 clearstatcache()。
Arseny Mogilev
11 年前
<?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;
}

?>
ivijan dot stefan at gmail dot com
7 年前
此函数还可以非常适合浏览器缓存控制。例如,您有一个样式表,并且希望确保每个人都拥有最新版本。您可以每次编辑时都重命名它,但这将是浪费时间。相反,您可以像这样操作

<?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 和具有相同名称的图像。
honza dot kuchar at grifart dot cz
8 年前
对于大于 2 GB 的文件,请使用我名为 Big File Tools 的库。 https://github.com/jkuchar/BigFileTools. Stackoverflow 上有更多详细信息: http://stackoverflow.com/a/35233556/631369
Damien Dussouillez
7 年前
<?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;
}
}

//使用 fseek 快速跳过前 2 GB。之后,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;
}
synnus at gmail dot com
8 年前
// 最佳转换带文件大小的负数。
// 不适用于大于 4GB 的文件
//
// 特别适用于 32 位系统。限制转换 filsize 为 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 和最后一个偏移量到 0 的 4GB 加入
// 您的计算,因此对于精确的字节数,“+ 2” 。

<?php
function filsize_32b($file) {
$filez = filesize($file);
if(
$filez < 0) { return (($filez + PHP_INT_MAX) + PHP_INT_MAX + 2); }
else { return
$filez; }
}
?>
CertaiN
10 年前
获取远程文件大小最简单、最高效的实现

<?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));
}
?>
aidan at php dot net
19 年前
此函数快速计算目录的大小
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) 和千字节 (1024) 之间的区别。
http://en.wikipedia.org/wiki/Bytes
C0nw0nk
8 年前
这是我获取大于 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("path");
//示例:
echo "文件大小为:".find_filesize("D:\Server\movie.mp4")."";
?>
synnus at gmail dot com
8 年前
// 使用 Windows 命令 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;
}

?>
Anonymous
11 年前
此函数返回 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;
}
?>
Supermagnus
16 年前
<?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 中的永久重定向)

在这种情况下,例如
[content-length] => 数组

(

[0] => 294 // 请求的文件大小

[1] => 357556 // 重定向文件的实际大小

)
PHP-Hasan
5 年前
在 Windows 10 中,filesize 显然无法使用相对路径名。请改用绝对路径。$size = filesize(".\\myfile.txt"); 对我不起作用,而 "d:\\MyFiles\\Myfile.txt" 可以。is_file() 或 stat() 等类似函数也适用。除非给出绝对路径,否则它们将无法正常工作。
synnus at gmail dot com
8 年前
// 使用 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"');
}

?>
mbh789 at gmail dot com
7 年前
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;
}
jason dot whitehead dot tas at gmail dot com
16 年前
我创建了一个方便的函数,使用了 kaspernj at gmail dot com 和 md2perpe at gmail dot com 代码的一部分,它应该可以在 Windows、Linux 和 Mac(至少)上获取大于 4GB 的文件大小。

<?php
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 = $file->Size;
}
return
$size;
}
?>
php at yurgon dot de
4 年前
<?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 字节";
?>
linda dot collins at mailinator dot com
11 年前
一个快速实现,用于确定 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 PB(拍字节)。除非您在 PHP 中处理多 PB 的文件,或者代码在奇怪的硬件上执行,否则此函数将绰绰有余。此函数的每个部分都经过精心设计,以应对 32 位的缺陷。
匿名
10 年前
这是一个获取文件大小的函数,以人类易于理解的方式显示,包含小数点分隔符、千位分隔符、小数位数等。

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
synnus at gmail dot com
8 年前
<?php
// Windows 文件大小
// 如果 filesize() php > PHP_INT_MAX (4 294 967 296) :: 失败
// filesize_cmd 返回 Windows 测量的值

function 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;
}

?>
frank (at) haua dot net
13 年前
我有一个正在运行的 CLI 脚本,它在 ssh2_sftp 连接上使用 filesize 函数。它存在 >2Gb 的限制问题,而在本地则没有这个问题。我已经通过 ssh2_shell 执行 "du -sb" 命令解决了这个问题。

以下函数以 ssh2_connect 资源和路径作为输入。它可能不太整洁,但目前解决了这个问题。

<?php
function 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;
}
?>
webmaster at eclipse org
17 年前
在 64 位平台上,这对于获取大于 4GB 文件的文件大小似乎非常可靠

<?php
$a
= fopen($filename, 'r');
fseek($a, 0, SEEK_END);
$filesize = ftell($a);
fclose($a);
?>

tmont
15年前
这是我找到的获取远程文件大小的最佳方法。请注意,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
k dot reznichak at pcpin dot com
10 年前
这是一个获取 32 位和 64 位平台上大于 2GB 的大型文件大小的非常快速可靠的方法。

<?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;
}
?>
core58 at mail dot ru
18年前
对上一篇文章的一些说明和修改。
根据 RFC,当使用 HTTP/1.1 时,您的请求(无论是 GET、POST 还是 HEAD)都必须包含 Host 头字符串,这与 HTTP/1.0 不同,在 HTTP/1.0 中 Host 不是必需的。但是,无法确定远程服务器如何处理请求,因此您可以始终添加 Host(对于 HTTP/1.0 来说这不会是错误)。
host 值_必须_是主机名(不是 CNAME 且不是 IP 地址)。

此函数捕获包含 Location 头部的响应,并递归地向我们被移动到的主机发送 HEAD 请求,直到遇到最终响应。
(当从 PHP 脚本或使用 Apache mod_rewrite 的某些哈希链接下载某些内容时,您可能会经常遇到此类重定向。大多数下载管理器都能正确处理 302 重定向,因此此代码也执行此操作(通过 302 重定向递归运行)。)

[$counter302] 指定如果遇到重定向,允许此函数跳转多少次。如果初始限制(默认为 5)过期,则返回 0(应根据您的需要进行修改)。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;
}
?>
Svetoslav Marinov
15年前
这是我之前 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;
}
?>
itsrool at gmail dot com
15年前
我计算目录大小的解决方案

<?php
/**
* 获取目录大小
* @param directory $directory
* @return integer
*/
function dirSize($directory) {
$size = 0;
foreach(new
RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
$size+=$file->getSize();
}
return
$size;
}
?>
Lingasamy Sakthivel
7 年前
使用 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);
}
jakob dot riishede dot moller at gmail dot com
8 年前
"注意:由于 PHP 的整数类型是有符号的,并且许多平台使用 32 位整数,因此对于大于 2GB 的文件,某些文件系统函数可能会返回意外的结果。"

这应该是一个警告,而不是一个说明:对于必须对大文件采取自定义操作的应用程序,filesize - 正如其他一些评论所建议的那样 - 是无用的。
To Top