PHP:如何在现有文件的内容之间写入?

PHP:如何在现有文件的内容之间写入?,php,Php,如何在现有文件的内容之间写入 我尝试使用fseek()查找新位置并写入新内容,但它将旧内容替换为查找位置后的新字符串 我的目标是在现有文件的5个字符之后添加新内容 旧内容:aaaaabbbb,所需内容:aaaaaaa新内容bbbbb $file_handler = fopen('putty.log','w'); $new_content = 'this is new content'; fseek($file_handler,5); echo ftell($file_handler); //

如何在现有文件的内容之间写入

我尝试使用fseek()查找新位置并写入新内容,但它将旧内容替换为查找位置后的新字符串

我的目标是在现有文件的5个字符之后添加新内容

旧内容:
aaaaabbbb
,所需内容:
aaaaaaa新内容bbbbb

$file_handler = fopen('putty.log','w');
$new_content = 'this is new content';

fseek($file_handler,5);

echo ftell($file_handler); //5
fwrite($file_handler,$new_content);

nullnull替换旧内容这是新内容

你不能那样做

您只能使用ftruncate截断内容,然后再写入旧内容

一个不太清楚的例子

<?php

$file_handler = fopen('putty.log','rb+');
$new_content = 'this is new content';

fseek($file_handler,5);

$restOfContent = fread($file_handler,filesize('putty.log')-5);

ftruncate($file_handler,5);
fseek($file_handler,5);

echo ftell($file_handler); //5
fwrite($file_handler,$new_content);

fwrite($file_handler,$restOfContent);

fclose($file_handler)

你不能那样做

您只能使用ftruncate截断内容,然后再写入旧内容

一个不太清楚的例子

<?php

$file_handler = fopen('putty.log','rb+');
$new_content = 'this is new content';

fseek($file_handler,5);

$restOfContent = fread($file_handler,filesize('putty.log')-5);

ftruncate($file_handler,5);
fseek($file_handler,5);

echo ftell($file_handler); //5
fwrite($file_handler,$new_content);

fwrite($file_handler,$restOfContent);

fclose($file_handler)

  • 使用file_get_contents()将内容加载到变量
  • 在缓冲区上执行此操作
  • 使用file_put_contents()将内容保存到此文件
  • 使用file_get_contents()将内容加载到变量
  • 在缓冲区上执行此操作
  • 使用file_put_contents()将内容保存到此文件 如果您使用fseek()将数据写入文件,请记住在“r+”中打开该文件 模式,例如:

    $fp=fopen($filename,“r+”)

    如果您使用fseek()将数据写入文件,请记住在“r+”中打开该文件 模式,例如:

    $fp=fopen($filename,“r+”)


    在文件中间的写作不会使它伸展和推动内容向前(就像在文本编辑器中插入内容),而是在你开始书写的位置覆盖内容。 您需要做的是:

  • 读取旧数据的第一部分,直到需要写入新内容为止,并将该部分写入临时文件
  • 将新内容写入临时文件(您希望添加的内容)
  • 从旧文件中读取其余内容并将其写入临时文件
  • 删除旧文件
  • 将临时文件重命名为旧文件的名称
  • 例如:

    $original_file_name = '/tmp/putty.log';
    $temp_file_name = '/tmp/putty.tmp';
    $temp_file = fopen( $temp_file_name, 'w' );
    $file_handler = fopen( $original_file_name, 'r' );
    $old_data_size = 5;
    fwrite( $temp_file, fread( $file_handler, $old_data_size ) );
    $new_content = 'this is new content';
    fwrite( $temp_file, $new_content, strlen( $new_content ) );
    fwrite( $temp_file, fread( $file_handler, filesize( $original_file_name ) - $old_data_size ) );
    fclose( $file_handler );
    fclose( $temp_file );
    unlink( $original_file_name );
    rename( $temp_file_name, $original_file_name );
    

    确保Puty.Logo对您的WebServer(Apache / LoTutpD等)进程使用的用户有读/写权限,或者它对每个人都是可访问的(不推荐)。

    文件中间的写入不会使它伸展和推动内容前进(就像在文本编辑器中插入内容)一样。而是在开始写作的位置覆盖内容。 您需要做的是:

  • 读取旧数据的第一部分,直到需要写入新内容为止,并将该部分写入临时文件
  • 将新内容写入临时文件(您希望添加的内容)
  • 从旧文件中读取其余内容并将其写入临时文件
  • 删除旧文件
  • 将临时文件重命名为旧文件的名称
  • 例如:

    $original_file_name = '/tmp/putty.log';
    $temp_file_name = '/tmp/putty.tmp';
    $temp_file = fopen( $temp_file_name, 'w' );
    $file_handler = fopen( $original_file_name, 'r' );
    $old_data_size = 5;
    fwrite( $temp_file, fread( $file_handler, $old_data_size ) );
    $new_content = 'this is new content';
    fwrite( $temp_file, $new_content, strlen( $new_content ) );
    fwrite( $temp_file, fread( $file_handler, filesize( $original_file_name ) - $old_data_size ) );
    fclose( $file_handler );
    fclose( $temp_file );
    unlink( $original_file_name );
    rename( $temp_file_name, $original_file_name );
    

    确保putty.log对您的Web服务器(apache/lighttpd等)进程使用的用户具有读/写权限,或者每个人都可以访问它(不推荐)。

    如果文件太大,这是内存负担。是的,但开发速度最快;-)想一想代码在生命周期中是如何使用的,因为这可能是一个更好的解决方案,与您在这方面花费的时间相比,如果文件很大,这就是内存负担。是的,但开发速度最快;-)想想代码在生命周期中是如何使用的,因为这可能是相对于您花费的时间来说更好的解决方案。谢谢,我想w模式在开始时总是将文件长度截断为零。w实际上覆盖了现有的文件。谢谢,我猜w模式总是在开始时将文件截断为零长度。w实际上会覆盖现有文件。我们不需要在fread($file_handler,filesize('putty.log')-5)之后倒带()吗;?或者在读取EOF之后,如果我们再次搜索,它从开始开始?我想当文件指针到达EOF,我再次搜索时,它从0开始。我们不需要在fread($file_handler,filesize('putty.log')-5)之后倒带()吗;?或者在读取EOF后,如果我们再次搜索,它从开始开始?我想当文件指针到达EOF,我再次搜索时,它从0.Link开始