繁体   English   中英

如何写入文件的开头并插入而不是覆盖数据?

[英]How can I write to the beginning of a file and insert rather than overwrite data?

Pascal中有没有一种方法可以在不覆盖其他数据的情况下写入文件的开头?

我已经学会了Seek(F, 0); 但这会覆盖文件中的第一件事。

无法插入文件。 您只能覆盖或追加。 因此,如果您想用一个简单的线性文件自己做,则需要重写整个文件。 如果您的文件很大,那么它就不那么吸引人了。

解决问题的一种明显方法是使用本地数据库,而不是编写自己的文件处理机制。 数据库层为您管理索引编制,以便您避免昂贵的整个文件重写。

当然,如果文件很小并且不关心性能,那么可以轻松地解决问题。 此配方显示了如何将记录插入文件中的位置i 对于您声明的在开始时插入的目标,那么i将为零。

  • 然后将整个文件读入N条记录的数组中。
  • 将第一个i记录写回到文件中。
  • 将插入的记录写回到文件中。
  • 将剩余的Ni原始记录写回到文件中。

您不能在现有数据之前插入新数据。 写入文件的开头/中间总是会覆盖现有数据,您无法更改它。 您唯一的选择是创建一个新文件,首先将新数据写入其中,然后将现有文件的内容附加到新文件中,然后最后用新文件替换现有文件。

您可以使用以下算法实现目标:

  • 创建临时文件;
  • 将新数据写入此临时文件;
  • 从目标文件中读取所有数据,并将它们附加到临时文件中;
  • 重命名临时文件为目标文件;

这的变体。

procedure InsertFile(const aFile, aLine: String);
var
  vList: TStringList;
begin
  vList:= TStringList.Create;
  try
    vList.LoadFromFile(aFile);
    vList.Insert(0, aLine);
    vList.SaveToFile(aFile);
  finally
    vList.Free;
  end;
end;

但是有同样的局限性。 对于大文件,由于整个文件都已加载到内存中,因此速度会很慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM