我要对一个大的文件(先命名Bigfile.dat)进行操作包括 :主要查找,修改,写入
面临的问题
  我要对其进行查找,就需要建立一个索引文件(bigindx.dat)对其关键字索引.
  因为bigfile.dat的记录是一条一条的,而且都很大,又很多
  我是这样做的索引:关键字+这条记录在bigfile.dat中的位置(position)和长度(length).
  这样通过查找索引文件  可以直接定位到bigfile.dat记录的位置,提高些速度.
  这样看起来是可以的
问题开始:
 1: 可是我要对文件进行修改,而且修改只会使记录加长.就是文件里每一条记录的长度都是可变的,
  一旦要修改某一条记录.那么从这条记录以后的记录都要修改从文件里向后移动(你问我为什么
  不在写记录的时候多留出空间呢,因为修改后一般记录都会变横长的,我没法预留空间,再说也太浪费了
 ) 能不能把这么麻烦的问题简单化吗?
 2:即使我向上面那样做了可是,bigfile.dat里记录的位置已经移动了,我的索引文件也就作废了啊
  难道我还要全部更新索引文件了吗?
  有没有更好的作索引文件的方法呢?怎么做?
大家不要建议我用数据库因为我都建议过了,就是要用文件了,定死了,而且没有索引文件也是很困难的
因为文件要过很长时间才能备份依次的.数据又频繁很快就很大了啊.
大家看了不要头大,我给大家氨基酸补充能量

解决方案 »

  1.   

    你这样试试:
      bitfile定义一个结构:  IsDelete: Boolean;
      ContentLen: Integer;
      Content: PChar;IsDelete表示当前的记录是否给删除了。
    ContentLen是Content长度,记录了内容在bigfile中的长度 + 1,为什么+1,作为Content的结束符。以后修改时,将IsDelete置True,然后重新写入到bigfile的文件后面,相应的修改bigindex中的Offset,这样的话,不就行了。然后再做一个附加功能,就是压缩、整理这个bigfile,如果修改敏繁,那么产生的文件会越来越大,那么你得根据bigindex重新将bigfile写一遍,将IsDelete为True的过滤掉就行了在程序自己再具体些
      

  2.   

    比如你修改了中间index的数据,那么对应的Content会写到bigfile的后面,那么对其它的数据是没有影响的,所以也就不存在你第二个问题了。
      

  3.   

    TO:copy_paste(木石三) 你的意思是说只要把修改的记录写在bigfile的后面,并把前面的记录标记IsDelete置True
    然后修改其相应的offset那么offset 还是在会很大的就是说他记录的是bigfile中靠后的位置啊。即使以后压缩删掉IsDelete置True的记录,可是新记录还是会在bigfile中新的offset的位置啊就是说bigfile的大小没有变啊(因为新记录的offset就已经说明文件的大小了啊),删掉记录占的空间还是保留在bigfile里啊。你的意思是说在删掉IsDelete置True的同时还是要把后面的数据记录还是向前移动吗?那不又要修改bigindex了吗?
      

  4.   

    建议采用DBase的方式,两个文件,一个索引文件,一个数据文件。数据只添加,不删除。如果删除,用假删,即在记录前做标记。这样,数据文件用不着频繁重构。
    在提供一个Pack的函数,对两个文件进行重构,真正删除那些标记文件。
      

  5.   

    还没结束,我还没有正式做,欢迎大家提意见感谢
     TO:copy_paste(木石三)
     chechy(简简单单的活)
    给我很多启发!!!!
      

  6.   

    一般来说,本地桌面数据库有很快速的性能,如DBase、Paradox、Foxpro等,为什么不用用?
      

  7.   

    chechy说的很清楚了,楼主怎么还不明白?我这段时间做的就是这个东西,但没有涉及修改,保存的功能,但意思已经是这样了。索引文件是保存在内存中,它保存了其它文件的偏移,修改保存其实就是将索引文件的偏移修改一下就完了的事。
    修改保存必须需要索引,这是不可避免的,不要想着什么都不用改。Pack功能就是将内容重新检索,将已经不需要的内容去掉就是了。涉及到具体的代码,我也帮不了你