呵呵,这两天一直都在学习自定义文件存储的,知道自定义一个文件的话,大概有四个部分
“文件头”记录一下基本的信息如“版本”“时间”等等
“索引头”记录索引的个数,放置的开始和结束的位置。
“索引”记录文件放置的开始位置,文件的长度,别名的信息。
问题就出在索引放置的问上面了。
如果按照   
第一次    文件头+索引头+索引+数据,这样放置的话,
第二次添加 索引和数据就会这样     文件头+索引头+索引1+数据1(长度不等)+索引2+数据2(长度不等)(呵呵自己理解的可能不正确)
如果按照上面的方法的话,我试了试读不出索引我又另外想了一下,但这样的话每次都要把全部的索引读出,在数据写入完毕后,更新索引位置后写入。
及:文件头+索引头+数据1+数据2+数据3+索引1+索引2+索引3
希望各位有前辈能够指点一下,在下刚刚接触,上面理解可能有所偏差,见笑了。另在网上找到了一段代码,一直没弄清其具体储存的方式,感觉是按照我第一种想法来的,但没看明白,望高手点拨一下
我把他添加的记录的两个函数发上来了,这两个函数一直没看明白。大家有兴趣的下载来看看http://www.2ccc.com/article.asp?articleid=1452function 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;

解决方案 »

  1.   

    文件头+索引头+数据1+数据2+数据3+索引1+索引2+索引3
    省略号部分是新数据写入的区域,每次写入新数据后,放在尾部的索引位置是不是也随着整个文件长度的变化而改变呢?
      

  2.   

    放在尾部的索引需要变化,如果不变化就被覆盖改写了。
      

  3.   

    大家通常的做法是怎么样的,有么有其他更好的方法来保存索引??
      

  4.   

    额,这个问题太简单了吗?大神门都不愿意回答????????