呵呵,这两天一直都在学习自定义文件存储的,知道自定义一个文件的话,大概有四个部分
“文件头”记录一下基本的信息如“版本”“时间”等等
“索引头”记录索引的个数,放置的开始和结束的位置。
“索引”记录文件放置的开始位置,文件的长度,别名的信息。
问题就出在索引放置的问上面了。
如果按照
第一次 文件头+索引头+索引+数据,这样放置的话,
第二次添加 索引和数据就会这样 文件头+索引头+索引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+数据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;
解决方案 »
- 请问这个语句该怎么写
- 初学者初次开发Delphi程序(代理软件),恳求高手能给些思路
- 急求即时通讯服务端和客户端完整源码
- 一个简单的问题!聪明的程序员用delphi,聪明的程序员来回答这个问题
- 请教delphi中button的颜色如何更改?
- 求DELPHI 实现SQL server 动态链接语句
- 托盘图标好像是从属于application的,单独的dll好像不能有dll
- SpeedButton的DblClick为什么是无效的?它有什么作用?
- 在哪可以找到有关ISO 层次结构的详细中文资料?
- 请教完整的动态数组的使用方法?
- Delphi用ODAC的MasterSource连数据源插数据库的问题?
- 窗口打印程序怎么写
省略号部分是新数据写入的区域,每次写入新数据后,放在尾部的索引位置是不是也随着整个文件长度的变化而改变呢?