一尘不染

PHP x86如何在不使用外部程序的情况下获取大于2 GB的文件大小?

php

我需要获取文件大小超过2 GB的文件。(在4.6 GB文件上测试)。没有外部程序,有没有办法做到这一点?

当前状态:

  • filesize()stat()并且fseek()失败
  • fread()feof()作品

有可能通过读取文件内容来获取文件大小(极慢!)。

$size = (float) 0;
$chunksize = 1024 * 1024;
while (!feof($fp)) {
    fread($fp, $chunksize);
    $size += (float) $chunksize;
}
return $size;

我知道如何在64位平台(使用fseek($fp, 0, SEEK_END)ftell())上获取它,但是我需要32位平台的解决方案。


解决方案: 为此,我已经开始了开源项目。


阅读 232

收藏
2020-05-26

共1个答案

一尘不染

我已经开始了一个名为Big FileTools的项目。它被证明可以在Linux,Mac和Windows(甚至32位变体)上运行。即使对于大文件(>4GB),它也可以提供字节精确的结果。在内部,它使用积木/数学 -任意精度算术库。

使用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";

大文件工具内部使用驱动程序来可靠地确定所有平台上的确切文件大小。这是可用的驱动程序列表(2016年2月5日更新)

| 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());
2020-05-26