替换文件中的一行而不重写整个文件(在PHP中)


Replacing a line in a file without rewriting the entire file (in PHP)

假设我有一个中等大小的文本文件(~850kb,10000+行)

我想替换文件中的一行(或几行)。

目前的方法包括重写整个文件。我目前使用的方法是逐行读取整个文件,写入一个.tmp文件,完成后,我将tmp文件重命名()为原始源文件。

它有效,但速度很慢。当然,随着文件的增长,执行时间也会增加。

有没有其他方法(使用PHP)可以在每次需要替换或删除一两行时不必重写整个文件的情况下完成任务?

谢谢!我环顾四周,在斯塔克夫流上找不到答案。

如果替换行的大小与原始行完全相同,那么您可以在文件中的该位置简单地fwrite(),一切都很好。但是,如果它的长度不同(短或长),则必须重写替换后的文件部分。

这是没有办法的。较短的"新"行将在文件中留下空白,较长的"新的"行将覆盖下一行的第一部分。

基本上,你在问是否可以在另一块木板中间插入一块木板,而不必移动原来的木板。

您不能,因为文件存储在通用文件系统上的方式。一个文件总是占用一个或多个"块"的磁盘空间,例如块的大小为4096字节。具有一个字节数据的文件仍将占用一个完整块(占用4096字节的可用磁盘空间),而4097字节的文件将占用两个块(占用8192字节)。

如果从文件中删除一个字节,那么它所占用的一个块内将有一个字节的间隙,这是不可能存储在磁盘上的。您必须将所有其他字节移到文件的开头一个字节,这将影响当前和所有后续块。

另一种方法是,在块的中间添加字节,这显示了同样的问题:一个或多个字节不再适合4096个字节,因此它们必须转移到下一个块,以此类推,直到到达文件(以及所有块)的末尾。

块中唯一可以有未占用字节的地方是在形成文件的最后一个块的末尾。