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

hak*_*kre 2 php file-io file stream

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

hak*_*kre 10

如果要创建文件并对其进行读写(不截断),则需要使用模式中的fopen()函数打开文件'c+':

$handle = fopen($filename, 'c+');
Run Code Online (Sandbox Code Playgroud)

PHP然后具有stream_get_contents()允许读取具有特定长度(并且从文件中的特定偏移量)到字符串变量的一块字节的函数:

$buffer = stream_get_contents($handle, $length = 512, $offset = 0);
Run Code Online (Sandbox Code Playgroud)

但是,没有stream_put_contents()功能将字符串缓冲区写回特定位置/偏移量的流.相关函数file_put_contents()但不允许在特定偏移处写入文件句柄资源.但fseek()fwrite()这样做:

$bytes_written = false;
if (0 === fseek($handle, $offset)) {
    $bytes_written = fwrite($handle, $buffer, $length);
}
Run Code Online (Sandbox Code Playgroud)

这是完整的图片:

$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);
Run Code Online (Sandbox Code Playgroud)

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

$buffer = file_get_contents($filename);

// ... change $buffer ...

file_put_contents($filename, $buffer);
Run Code Online (Sandbox Code Playgroud)