PHP x64仍然返回错误的文件大小

时间:2014-06-16 21:53:11

标签: php size filesize

我正在尝试获取文件的文件大小> 2GB,但无论64位还是32位版本,PHP接缝都会出现问题。在64位操作系统上运行64位处理器的PHP 64位版本上,它仍然使用filesize()函数返回错误的文件大小。在我遇到它之前它返回一个负数,或者什么都没有...如果文件大小正在改变,但是数字正在改变,但是对于文件不准确> 2gb ...如果php使用的是32位整数,我可以理解一个小于实际大小,零甚至是负数的数字,但正如我所读,php 64bit应该支持文件大小> 2GB ...

我也尝试过使用fseek结束和ftell:

$a = fopen("c:\big.txt", 'r');
fseek($a,0,SEEK_END);
$fs = ftell($a);
fclose($a);
echo $fs;

但那只是给了0 ......

2 个答案:

答案 0 :(得分:0)

为什么不使用filesize函数?

echo filesize('c:\big.txt');

此功能在32位系统上可能无法正常工作,但应在64位系统上提供正确的大小:

  

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

答案 1 :(得分:0)

手册实际上说"这可能会在您的平台上被破坏。哦,太糟糕了。"

此评论可能有所帮助:http://us3.php.net/manual/en/function.filesize.php#113457。它与您尝试的类似,但它似乎假设SEEK_END也不起作用。

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

免责声明:我没有尝试过这个。