【发布时间】:2016-09-10 08:43:10
【问题描述】:
编辑:对于其他寻找答案的人,我使用了this。可能是解决问题的最快方法。
假设我有一个 非常 大的 test.txt 文件,其中包含:
line1
line4
line5
line6
我希望在第 1 行之后添加第 2 行和第 3 行。我使用以下代码来实现这一点:
$file = fopen('test.txt', 'r+');
fseek($file, 5);
fwrite($file, "\r\nline2\r\nline3\r\n");
但是,txt 文件现在变成了,第 4 行和第 5 行被覆盖:
line1
line2
line3
line6
我在fopen 中使用c+ 模式得到相同的结果。我不能使用a 或a+,因为它们只是将内容附加到文件末尾。我也无法将整个文件读入一个字符串并对其进行分析以进行更改,因为这个文件真的很大。
有什么办法可以解决这个问题?
注意:由于文件中的大量内容,任何涉及将整个文件作为字符串读取然后从那里进行更改的解决方案都不可行。如果有任何厚颜无耻的变通方法可以在第一行和第二行之间的几行中添加内容,那就足够了。 :D
【问题讨论】:
-
您不能简单地将新内容添加到文件中间;文件系统不会在您插入新字符时将所有内容打乱,实际上您必须自己编写代码来执行此操作....通常打开 1 个文件用于读取,1 个用于写入,然后在最后重命名
-
一般你可以stream copy从第一个文件到第二个文件直到你的搜索位置,然后手动将你的新内容添加到第二个文件,然后将剩余内容从搜索位置流式复制到末尾文件
-
您可以添加足够的空白空间来为您提供插入 2 行的空间,然后复制该行,然后重新插入它和另一行。虽然这并不理想,因为每一行都需要空格,并且在您添加/覆盖行时它会降级(您只能添加与留下空白空间一样多的数据)。它还会不必要地膨胀文件大小。基本问题是每个字节(字符)在文件中都有一个位置,就像网格上的钉子一样。要查找,只需将指针移动到网格单元,然后从那里写入,覆盖网格单元中现有的钉子。
-
只有纯php?如果文件真的很大 - 尝试
exec使用:` gawk -i inplace -v n=line_number -v s="content" 'NR == n {print s} {print}' path_to_file`
标签: php