自定义文件储存的问题,我是否该每次都更新索引的位置
时间:2011-10-16
来源:互联网
呵呵,这两天一直都在学习自定义文件存储的,知道自定义一个文件的话,大概有四个部分
“文件头”记录一下基本的信息如“版本”“时间”等等
“索引头”记录索引的个数,放置的开始和结束的位置。
“索引”记录文件放置的开始位置,文件的长度,别名的信息。
问题就出在索引放置的问上面了。
如果按照
第一次 文件头+索引头+索引+数据,这样放置的话,
第二次添加 索引和数据就会这样 文件头+索引头+索引1+数据1(长度不等)+索引2+数据2(长度不等)(呵呵自己理解的可能不正确)
如果按照上面的方法的话,我试了试读不出索引
我又另外想了一下,但这样的话每次都要把全部的索引读出,在数据写入完毕后,更新索引位置后写入。
及:文件头+索引头+数据1+数据2+数据3。。。。。。。。。+索引1+索引2+索引3
希望各位有前辈能够指点一下,在下刚刚接触,上面理解可能有所偏差,见笑了。
另在网上找到了一段代码,一直没弄清其具体储存的方式,感觉是按照我第一种想法来的,但没看明白,望高手点拨一下
我把他添加的记录的两个函数发上来了,这两个函数一直没看明白。大家有兴趣的下载来看看http://www.2ccc.com/article.asp?articleid=1452
Delphi(Pascal) code
“文件头”记录一下基本的信息如“版本”“时间”等等
“索引头”记录索引的个数,放置的开始和结束的位置。
“索引”记录文件放置的开始位置,文件的长度,别名的信息。
问题就出在索引放置的问上面了。
如果按照
第一次 文件头+索引头+索引+数据,这样放置的话,
第二次添加 索引和数据就会这样 文件头+索引头+索引1+数据1(长度不等)+索引2+数据2(长度不等)(呵呵自己理解的可能不正确)
如果按照上面的方法的话,我试了试读不出索引
我又另外想了一下,但这样的话每次都要把全部的索引读出,在数据写入完毕后,更新索引位置后写入。
及:文件头+索引头+数据1+数据2+数据3。。。。。。。。。+索引1+索引2+索引3
希望各位有前辈能够指点一下,在下刚刚接触,上面理解可能有所偏差,见笑了。
另在网上找到了一段代码,一直没弄清其具体储存的方式,感觉是按照我第一种想法来的,但没看明白,望高手点拨一下
我把他添加的记录的两个函数发上来了,这两个函数一直没看明白。大家有兴趣的下载来看看http://www.2ccc.com/article.asp?articleid=1452
Delphi(Pascal) code
function TSelfFileClass.AddItems(IIdxAils: string; IFmt: RFileContentFmt; var IBuff: TMemoryStream): byte; var TepIndex: Rindex; begin EnCompressStream(IBuff); Result := CstFine; //将索引值加1 if (GoodIdxCount = 0) and (BadIdxCount = 0) then begin //如果是第1条记录纪录一下第1个索引的位置 Goodidxpos := sizeof(LRhead) + sizeof(LRidx); Lindex.MupIdxPos := CstNotExits; Lindex.MisGoodIdx := True; Lindex.MidxAils := IIdxAils; Lindex.MselfidxPos := sizeof(LRhead) + sizeof(LRidx); Lindex.MContentPos := sizeof(LRhead) + sizeof(LRidx) + sizeof(Lindex); Lindex.MContentlen := IBuff.Size; Lindex.MnextIdxPos := CstNotExits; LastGoodIdxPos := Lindex.MselfidxPos; //记录最后一个索引的位置 end else begin //不是第一条记录 Lindex.MupIdxPos := LastGoodIdxPos; Lindex.MisGoodIdx := True; Lindex.MidxAils := IIdxAils; Lindex.MselfidxPos := OPreater.Seek(0, soEnd); Lindex.MContentPos := Lindex.MupIdxPos + sizeof(Lindex); LastGoodIdxPos := Lindex.MselfidxPos; //记录最后一个索引的位置 Lindex.MContentlen := IBuff.Size; Lindex.MnextIdxPos := CstNotExits; TepIndex := GetIndex(Lindex.MupIdxPos); //更新上一个索引的下接位置 TepIndex.MnextIdxPos := Lindex.MselfidxPos; ModfyIndex(TepIndex); end; AddIndex(lindex); //添加索引 AddContentFmt(IFmt); //写入内容头 AddContent(IBuff); //写入内容体 GoodIdxCount := GoodIdxCount + 1; end;function TSelfFileClass.AddItems(IFmt: RFileContentFmt; var IBuff: TMemoryStream): byte; var TepIndex: Rindex; begin EnCompressStream(IBuff); Result := CstFine; //将索引值加1 if GoodIdxCount = 0 then begin //如果是第1条记录纪录一下第1个索引的位置 Goodidxpos := OPreater.Seek(0, soEnd); Lindex.MupIdxPos := CstNotExits; //-1 Lindex.MisGoodIdx := True; Lindex.MselfidxPos := OPreater.Seek(0, soEnd); //文件尾部开始 Lindex.MContentPos := Lindex.MupIdxPos + sizeof(Lindex); //-1+索引长度 Lindex.MContentlen := IBuff.Size; //文件长度 Lindex.MnextIdxPos := CstNotExits; //-1 LastGoodIdxPos := Lindex.MselfidxPos; //记录最后一个索引的位置 end else begin //不是第一条记录 Lindex.MupIdxPos := LastGoodIdxPos; //上一索引的位置 Lindex.MisGoodIdx := True; Lindex.MselfidxPos := OPreater.Seek(0, soEnd); //文件尾部开始 Lindex.MContentPos := Lindex.MupIdxPos + sizeof(Lindex); //之前的索引长度+自身的长度 LastGoodIdxPos := Lindex.MselfidxPos; //记录最后一个索引的位置 Lindex.MContentlen := IBuff.Size; Lindex.MnextIdxPos := CstNotExits; TepIndex := GetIndex(Lindex.MupIdxPos); //更新上一个索引的下接位置 TepIndex.MnextIdxPos := Lindex.MselfidxPos; ModfyIndex(TepIndex); end; AddIndex(lindex); //添加索引 AddContentFmt(IFmt); //写入内容头 AddContent(IBuff); //写入内容体 GoodIdxCount := GoodIdxCount + 1; end;
作者: liu1986jie 发布时间: 2011-10-16
文件头+索引头+数据1+数据2+数据3。。。。。。。。。+索引1+索引2+索引3
省略号部分是新数据写入的区域,每次写入新数据后,放在尾部的索引位置是不是也随着整个文件长度的变化而改变呢?
省略号部分是新数据写入的区域,每次写入新数据后,放在尾部的索引位置是不是也随着整个文件长度的变化而改变呢?
作者: liu1986jie 发布时间: 2011-10-16
放在尾部的索引需要变化,如果不变化就被覆盖改写了。
作者: SQLDebug_Fan 发布时间: 2011-10-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28