如何更改文件的前512个字节?

时间:2013-03-18 09:50:10

标签: php file file-io stream

我有一个PHP的大文件,我想用其他512个字节替换前512个字节。是否有任何PHP功能可以帮助我?

1 个答案:

答案 0 :(得分:10)

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

$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()中概述的How to update csv column names with database table header,或者如果文件不大,也可以在内存中执行此操作:

$buffer = file_get_contents($filename);

// ... change $buffer ...

file_put_contents($filename, $buffer);