在 Delphi 中的二进制文件中间插入记录

Insert record in the middle of a binary file in Delphi

我正在 Delphi 中创建一个程序,我需要在二进制文件中插入一条记录,但要插入 2 个现有记录之间。谁能帮帮我?

如果你真的想插入,那么你必须创建一个不同名称的新文件,复制旧文件内容,直到插入点,到新文件,然后将新记录写入新文件,最后将旧文件的其余部分复制到新文件。然后删除旧文件并将新文件重命名为旧文件的名称。

原文件:

[A][B][C][D][E][F][G][H]
            ^
            insertion point 

首先复制插入点前的内容:

[A][B][C][D]

写入新记录:

[A][B][C][D][Z]

然后复制剩下的:

[A][B][C][D][Z][E][F][G][H]

如果您只想替换一条记录,请查看随机访问 I/O,使用旧的 Pascal SeekBlockRead/BlockWrite,或者流,使用 TStream.SeekTStream.Write。后者是更现代的做事方式。

更新

根据评论中的建议,您还可以执行以下操作(使用与上述相同的例程):

打开文件进行读写,将文件的大小增加要插入的记录的大小,将内容"above"移动到上层文件的插入点"address" 然后把记录写到插入点。

之前:

[A][B][C][D][E][F][G][H]
            ^
            insertion point 

然后将 E 向上移动:

[A][B][C][D][E][E][F][G][H]
            ^  <---------->

最后写入新记录:

[A][B][C][D][Z][E][F][G][H]
            ^  <---------->

如果你想复制内容块(比如 4k 块),那么不要忘记向后复制(从高文件指针到低文件指针),这样你就不会覆盖你还没有读过的内容.或者你使用双缓冲区。或者...


您可以根据需要将其复杂化。我个人可能会复制到一个新文件,删除旧文件并重命名新文件并完成它。

该方法与将元素插入数组的方法基本上完全相同。请注意,它依赖于大小相同的记录。

  1. 从文件中读取下一条记录以备后用。
  2. new 记录覆盖 next 记录。
  3. 将您的 "insert position" 条记录向前移动。
  4. 从 1 开始重复,将您之前读取的记录视为要插入的记录。