+ -
当前位置:首页 → 问答吧 → 自定义文件储存的问题,我是否该每次都更新索引的位置

自定义文件储存的问题,我是否该每次都更新索引的位置

时间:2011-10-16

来源:互联网

呵呵,这两天一直都在学习自定义文件存储的,知道自定义一个文件的话,大概有四个部分
“文件头”记录一下基本的信息如“版本”“时间”等等
“索引头”记录索引的个数,放置的开始和结束的位置。
“索引”记录文件放置的开始位置,文件的长度,别名的信息。
问题就出在索引放置的问上面了。
如果按照  
第一次 文件头+索引头+索引+数据,这样放置的话,
第二次添加 索引和数据就会这样 文件头+索引头+索引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

热门下载

更多