php - fwrite() 超过 2 GiB?

标签 php file-io fopen 32-bit fwrite

<分区>

我有一组要连接的文件(每个文件代表多部分下载的一部分)。

每个拆分文件的大小约为 250MiB,我有可变数量的文件。

我的串联逻辑很简单:

if (is_resource($handle = fopen($output, 'xb')) === true)
{
    foreach ($parts as $part)
    {
        if (is_resource($part = fopen($part, 'rb')) === true)
        {
            while (feof($part) !== true)
            {
                fwrite($handle, fread($part, 4096));
            }

            fclose($part);
        }
    }

    fclose($handle);
}

我花了一段时间来追踪它,但显然,每当我有超过 8 个单独的部分(总计 2GiB)时,我的输出文件就会被截断为 2147483647 字节(由 sprintf('%u', $输出))。

我想这是由于 fopen()fwrite() 使用了某种 32 位内部计数器。

我该如何解决这个问题(最好只使用 PHP)?

最佳答案

作为解决方法,您可以使用 shell。如果代码必须是可移植的,那么这将只包括大约两个适用于 Windows 和 Linux 的变体(也包括 MacOS)。

Linux

cat file1.txt file2.txt  > file.txt

window

copy file1.txt+file1.txt file.txt

请注意,在创建命令行时,转义变量参数非常重要。使用 escapeshellarg() 包装文件名(参见 http://de1.php.net/escapeshellarg )。

要检测您使用的是 Windows 还是 Linux,请查看常量 PHP_OS。 (最好在这里解释:http://www.php.net/manual/en/function.php-uname.php)

关于php - fwrite() 超过 2 GiB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19438203/

相关文章:

php - 如何在 CodeIgniter 中包含 CSS 文件?

c# - 显示该位置已存在文件的对话框

php - 使用根目录之外的 php 文件的 HTML 表单操作?

php - 在 php 中提交表单期间,DateTime 未存储在 mysql 数据库中

android - 如何将 Android 传感器的数据写入我以后可以访问的文档?

c++ - 打开文件并使用 fseek 获取文件大小 - C++

php - PHP 的 fopen 和 fwrite 的 VB.NET 版本是什么(如果存在)?

php - SQL 结果作为 txt.file 由 php

php - 这段代码的 php 等价物是什么?

c - 危险的脚本它会起作用吗?