2

我在 PHP 中有一个大文件,我想用其他 512 个字节替换其中的前 512 个字节。是否有任何 PHP 函数可以帮助我解决这个问题?

4

1 回答 1

10

如果您想有选择地创建一个文件并对其进行读写(不截断它),您需要使用以下模式打开fopen()文件'c+'

$handle = fopen($filename, 'c+');

PHP 然后具有stream_get_contents()允许将具有特定长度(以及从文件中的特定偏移量)的字节块读取到字符串变量中的功能:

$buffer = stream_get_contents($handle, $length = 512, $offset = 0);

但是,没有stream_put_contents()将字符串缓冲区写回特定位置/偏移量的流的功能。一个相关的功能是file_put_contents(),但它不允许在特定偏移量处写入文件句柄资源。但是有fseek()并且fwrite()可以做到这一点:

$bytes_written = false;
if (0 === fseek($handle, $offset)) {
    $bytes_written = fwrite($handle, $buffer, $length);
}

这是完整的图片:

$handle = fopen($filename, 'c+');
$buffer = stream_get_contents($handle, $length = 512, $offset = 0);

// ... change $buffer ...

$bytes_written = false;
if (0 === fseek($handle, $offset)) {
    $bytes_written = fwrite($handle, $buffer, $length);
}
fclose($handle);

如果 的长度$buffer不固定,这将无法正常工作。在这种情况下,最好使用两个文件并stream_copy_to_stream()按照如何使用数据库表头更新 csv 列名中所述使用,或者如果文件不大,也可以在内存中执行此操作:

$buffer = file_get_contents($filename);

// ... change $buffer ...

file_put_contents($filename, $buffer);
于 2013-03-18T09:50:10.357 回答