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

时间:2016-04-17 21:50:58

标签: file delphi binary pascal records

我在Delphi中创建程序,我需要在二进制文件中插入记录,但需要在2个现有记录之间插入记录。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

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

原始档案:

[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]

如果您只想替换记录,那么请使用旧的Pascal SeekBlockRead / BlockWrite或流来查看随机访问I / O,使用{ {1}}和TStream.Seek。后者是更现代的做事方式。

更新

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

打开文件进行读写,根据要插入的记录大小增加文件大小,移动内容"以上"插入点远离高级文件"地址"然后将记录写入插入点。

在:

TStream.Write

然后向上移动E:

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

最后写下新记录:

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

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

你可以根据自己的意愿使它变得复杂。我个人可能会复制到一个新文件,删除旧文件并重命名新文件并完成它。

答案 1 :(得分:0)

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

  1. 从文件中读取 next 记录以供日后使用。
  2. 使用 new 记录覆盖 next 记录。
  3. 向前移动“插入位置”1条记录。
  4. 从1重复,将您之前阅读的记录视为要插入的记录。