请教自定义文件结构(Record)在读取时如何容错

bdmh
移动开发领域优质创作者
博客专家认证
2008-10-31 10:24:05
我现在想把存储到数据库的数据用自定义的文件结构进行存储,适用Record和是数组构建了一个自己的文件结构,并通过流保存到文件中,现在的问题是,如果在Record记录体中,增加了字段,长度就发生了变化,那样读取没增加字段前文件时就会出错,那如何打开没增加字段前所保存的文件呢
...全文
177 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahjoe 2008-11-14
  • 打赏
  • 举报
回复
不能使用file of TRecord
bdmh 2008-11-14
  • 打赏
  • 举报
回复
ERR0RC0DE ,你的方法是最基本的方法,这个我已经实现,只是想请教有没有更好的,更高效的方法,看来是没有了,结贴
ERR0RC0DE 2008-11-13
  • 打赏
  • 举报
回复
如果你的已保存的文件中,未包含任何信息,无法处理

如果你的文件头,包含有版本/标志信息,则可以根据此类信息进行进行判断
一般就是文件头写入一些信息,如:
Flag_OR_Ver: Integer;
RecordCount: Integer;
Reserve: array [0..255] of Byte;

然后根据Flag_or_ver判断后继内容的结构字段长度。。。

如果纯粹为了改正,直接写一个老版本的读入转化函数处理就是了。
如:

type
TOld = record
V: Integer;
end;

TNew = record
V: Integer;
NewV: Integer;
...
end;

function ReadData(Stream: TFileStream): TNew;
begin
FillChar(Result, SizeOf(Result), 0);
Stream.ReadBuffer(Result.V, SizeOf(V));
end;

方法多多,怎么试怎么有,试一下很累?
bdmh 2008-11-13
  • 打赏
  • 举报
回复
字段长度都是固定的,但由record组成的数组元素个数是可变的,这样就不能使用file of TRecord了
sdzeng 2008-11-06
  • 打赏
  • 举报
回复
检查一下你的文件格式定义是否合理,
如果你的字段数和字段长度经常变化,
最好在定义文件时,先说明文件有多少个字段,每个字段长度是多少
bdmh 2008-11-06
  • 打赏
  • 举报
回复
但是文件类型(file of TMyRecord)不能使用动态数组,都是定长的,我的结构是由很多Record数组组成的,都是动态分配的
aniugee 2008-10-31
  • 打赏
  • 举报
回复
var
MyRecord:TMyRecord;

Write(FDataFile,History)改成Write(FDataFile,MyRecord);
aniugee 2008-10-31
  • 打赏
  • 举报
回复
不要用流,用文件类型保存

TMyRecord=record
ID:LongWord;
SendDateTime:TDatetime;
...
end;

var
FDataFile: file of TMyRecord;
begin
AssignFile(FDataFile,'文件路径');
if not FileExists('文件路径') then
Rewrite(FDataFile);

Reset(FDataFile);
Seek(FDataFile,fileSize(FDataFile));
try
Write(FDataFile,History);
finally
CloseFile(FDataFile);
end;
end;
bdmh 2008-10-31
  • 打赏
  • 举报
回复
可是我不知道增加了哪些字段,那样读的时候,流的内容与现在的新结构无法匹配,也不知该如何判断那些字段不用读取,怎样能跳过新增字段,只把原有的字段数据读出呢
yuqianyi1974 2008-10-31
  • 打赏
  • 举报
回复
保存文件时,将记录的大小保存下来,根据记录大小用流读取应该没有问题

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧