Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPx64仍然返回错误的文件大小_Php_Size_Filesize - Fatal编程技术网

PHPx64仍然返回错误的文件大小

PHPx64仍然返回错误的文件大小,php,size,filesize,Php,Size,Filesize,我正在尝试获取大于2GB的文件大小,但无论是64位还是32位版本,PHP都可能存在问题。在64位操作系统的64位处理器上运行的PHP 64位版本上,它仍然使用filesize函数返回错误的文件大小。在我遇到它返回一个负数,或者什么都没有之前。。。如果文件大小正在更改,则该数字会更改,但对于大于2gb的文件,该数字不准确。。。如果php使用32位整数,我可以理解一个小于实际大小的数字,零甚至负数,但正如我所读到的,PHP64位应该支持大于2gb的文件大小 我还尝试使用fseek结束和ftell,如

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

我还尝试使用fseek结束和ftell,如:

$a = fopen("c:\big.txt", 'r');
fseek($a,0,SEEK_END);
$fs = ftell($a);
fclose($a);
echo $fs;
但是这只会给0…

为什么不直接使用filesize函数呢

echo filesize('c:\big.txt');
此函数可能无法在32位系统上正常工作,但应在64位系统上为您提供正确的大小:

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


手册上说这可能在你的平台上被破坏。哦,太糟糕了

此评论可能有帮助:。它与您尝试的类似,但似乎认为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;
}

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

我想OP已经试过了。该函数文档中的注释指出,对于大于2GB的文件,某些文件系统函数可能会返回意外结果。您提到文件大小正在更改。是否有另一个进程附加到该文件?如果是这样,请在调用filesize:之前尝试执行clearstatcache:看起来很有趣,但是,当我尝试它时,它一直循环,直到被30秒的限制停止。。我假设,即使它有效,它也需要很长时间才能在使用中被接受。。。我需要一个功能,将有点效率,因为它将处理大量的文件…我能想到的唯一可靠的方法是创建一个第三方控制台应用程序,接受一个文件名作为参数,然后让它通过PHP脚本,但即使我这样做,PHP是否能够处理长整数?如果$size>=900000000,像一个简单的函数吗?此外,现在脚本将被锁定在一个平台上,这甚至不考虑使用第三方通行证的性能损失,尽管……本页可能有更好的答案: