4

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

我想替换分布在文件中的特定行(或几行)。

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

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

是否有另一种方法(使用 PHP)来完成工作,而无需在每次需要替换或删除一两行时重写整个文件?

谢谢!我环顾四周,在stackoverflow上找不到这个答案。

4

2 回答 2

6

如果替换的大小与原始行的大小完全相同,那么您只需fwrite()在文件中的该位置即可,一切都很好。但如果它的长度不同(更短更长),您将不得不重写替换后的文件部分。

没有办法解决这个问题。较短的“新”行将在文件中留下空白,较长的“新”行将覆盖下一行的第一部分。

基本上,您是在问是否可以在另一块板的中间插入一块木头,而无需移动原始板。

于 2012-04-05T14:55:05.993 回答
3

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

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

反过来,在块的中间添加字节,也会出现同样的问题:您将有一个或多个字节不再适合 4096 字节,因此它们必须转移到下一个块,依此类推,直到到达文件(和所有块)的末尾。

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

于 2012-04-05T15:01:26.413 回答