我已经开始了一个名为
Big File Tools 的项目。它已经
证明可以在Linux、Mac和Windows上运行(包括32位变体)。即使对于巨大的文件(>4GB),它也提供字节精确的结果。它在内部使用
brick/math - 任意精度算术库。
使用
composer 安装它。
composer install jkuchar/BigFileTools
并使用它:
<?php
$file = BigFileTools\BigFileTools::createDefault()->getFile(__FILE__);
echo $file->getSize() . " bytes\n";
结果是 BigInteger,因此您可以使用结果进行计算。
$sizeInBytes = $file->getSize();
$sizeInMegabytes = $sizeInBytes->toBigDecimal()->dividedBy(1024*1024, 2, \Brick\Math\RoundingMode::HALF_DOWN);
echo "Size is $sizeInMegabytes megabytes\n";
Big File Tools内部使用驱动程序来可靠地确定所有平台上的确切文件大小。以下是可用驱动程序列表(更新于2016-02-05)
| Driver | Time (s) ↓ | Runtime requirements | Platform
|
| CurlDriver | 0.00045299530029297 | CURL extension | -
| NativeSeekDriver | 0.00052094459533691 | - | -
| ComDriver | 0.0031449794769287 | COM+.NET extension | Windows only
| ExecDriver | 0.042937040328979 | exec() enabled | Windows, Linux, OS X
| NativeRead | 2.7670161724091 | - | -
您可以使用BigFileTools与任何一个,或者默认选择最快的(BigFileTools::createDefault()
)
use BigFileTools\BigFileTools;
use BigFileTools\Driver;
$bigFileTools = new BigFileTools(new Driver\CurlDriver());
if($size>=0x1000000) { $upper+=1; $size-=0x1000000 }
。您的文件读取方法肯定是有效的,但不实用。遗憾的是,PHP的fseek(SEEK_CUR)接口不返回跳过的数量,否则这将更容易。 - mariodisk_free_space()
在处理大数字时确实存在偏差错误,但由于其本质,它不可能100%准确。个别文件系统实现、群集大小等可能会影响实际可用空间。因此,disk_free_space()
受到不可避免的浮点偏差影响,但在那个级别上并不需要精确。文件大小是精确数字,没有误差容忍度。搞砸文件大小,您将丢失数据。 - Unsigned