当前位置:  开发笔记 > 编程语言 > 正文

用PHP覆盖文件中的行

如何解决《用PHP覆盖文件中的行》经验,为你挑选了3个好方法。

覆盖文件中特定行的最佳方法是什么?我基本上想要在文件中搜索字符串'@parsethis',并用其他内容覆盖该行的其余部分.



1> Stefan Gehri..:

如果文件非常大(日志文件或类似的东西),并且你愿意牺牲内存消耗的速度,你可以打开两个文件,基本上是通过使用文件而不是系统内存来提出Jeremy Ruten提出的技巧.

$source='in.txt';
$target='out.txt';

// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
    $line=fgets($sh);
    if (strpos($line, '@parsethis')!==false) {
        $line='new line to be inserted' . PHP_EOL;
    }
    fwrite($th, $line);
}

fclose($sh);
fclose($th);

// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);



2> Jeremy Ruten..:

如果文件不是太大,最好的方法可能是将文件读入带有file()的行数组,在字符串数组中搜索字符串并编辑该行,然后将数组重新插入()和fwrite()一起回到文件中.


如果在其中使用file(),则在内爆之后,您可能还希望file_put_contents()在一行中执行此操作。

3> Andru Luvisi..:

您的主要问题是新行可能与旧行的长度不同.如果您需要更改行的长度,则无法在更改的行之后重写至少所有文件.最简单的方法是创建一个新的,修改过的文件,然后将其移到原始文件上.这样,读者可以随时获得完整的文件.使用锁定确保一次只有一个脚本正在修改文件,并且由于您要替换该文件,请对另一个文件执行锁定.退房flock().

如果您确定新行的长度与旧行的长度相同,则可以以读/写模式打开文件(r+用作第二个参数fopen())并调用ftell()以保存每次开始时行开始的位置打电话fgets()来读一条线.找到要覆盖的行后,可以使用fseek()返回行的开头和fwrite()新数据.强制线始终具有相同长度的一种方法是将其填充到最大可能长度.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有