在 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 Seek
和 BlockRead
/BlockWrite
,或者流,使用 TStream.Seek
和 TStream.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 块),那么不要忘记向后复制(从高文件指针到低文件指针),这样你就不会覆盖你还没有读过的内容.或者你使用双缓冲区。或者...
您可以根据需要将其复杂化。我个人可能会复制到一个新文件,删除旧文件并重命名新文件并完成它。
该方法与将元素插入数组的方法基本上完全相同。请注意,它依赖于大小相同的记录。
- 从文件中读取下一条记录以备后用。
- 用 new 记录覆盖 next 记录。
- 将您的 "insert position" 条记录向前移动。
- 从 1 开始重复,将您之前读取的记录视为要插入的记录。
我正在 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 Seek
和 BlockRead
/BlockWrite
,或者流,使用 TStream.Seek
和 TStream.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 块),那么不要忘记向后复制(从高文件指针到低文件指针),这样你就不会覆盖你还没有读过的内容.或者你使用双缓冲区。或者...
您可以根据需要将其复杂化。我个人可能会复制到一个新文件,删除旧文件并重命名新文件并完成它。
该方法与将元素插入数组的方法基本上完全相同。请注意,它依赖于大小相同的记录。
- 从文件中读取下一条记录以备后用。
- 用 new 记录覆盖 next 记录。
- 将您的 "insert position" 条记录向前移动。
- 从 1 开始重复,将您之前读取的记录视为要插入的记录。