首页  编辑  

自定义文件数据结构的一个支持单元

Tags: /超级猛料/Stream.File.流、文件和目录/文件操作/   Date Created:

如果用DELPHI中的数据库控件的话,在以后的软件发布中将带有大量的库文件,才能使用,这将增大发布软件的容量大小,我想自己用如:filecreate,read,write,..等函数来自编一个DAT文件,对其进行操作,在对dat文件的操作过程中,读和写都很容易,我想在此问各位高手,-----如何对dat文件进行数据修改和删除里面的记录数据呢??

你可以到http://www.21jx.com/~tinydb/gb/下在一个TinyDB.以下是其网页上的介绍:

TinyDB 是什么?

TinyDB是提供给Delphi和BCB程序员的一组Delphi组件,目前包含 TTinyTable 和 TTinyDB。

·完全兼容Delphi和BCB中所有的Data Controls

·无须BDE的支持,无须附带任何DLL或OCX,开发绿色软件的最佳选择

·支持对BLOB型字段数据的压缩,并提供多种不同压缩方案

·优良的加密性能,预置三种先进的加密算法对数据库进行加密

·提供数据处理扩展接口,可挂接任意压缩和加密或者自定义算法

·加密和压缩均对用户透明,存取数据库时自动进行

·单一文件型数据库,无论数据库多复杂,只有一个文件

·完全支持基本的数据库结构定义

·接口和Delphi(BCB)中的数据库相关组件保持一致,易于使用

·提供配套工具 TinyDB Desktop 以及详细开发帮助文档和例程

 TinyDB 能做什么?  当我们用Delphi或BCB做一个软件的时候,如果要将大量数据保存到硬盘上,通常采用的方法无外乎两种:第一种是使用Borland Database Engine(BDE);第二种是自己制定一个文件格式,用读写文件的方法把数据保存到文件中。

  对于第一种方法,没什么可说的,这大概是最常用也是最权威的方法。但它有个缺陷:必须附带并安装BDE的支持包。这对于开发一个力求精致小巧、绿色实用的软件来说,似乎并不是最好的方案。

  而第二种方法,虽然无须BDE的支持,但文件格式的拟定、维护往往让人累不堪言。当软件的功能增加,文件格式需要做相应调整的时候,为了保持兼容性而付出的代价往往是相当巨大的。而且稍有不慎,便会给用户数据带来损失。

  TinyDB所要做的事情,便是在不需要BDE支持的前提下,给软件提供一个稳定的数据库系统,把逻辑格式和物理格式分开,并提供高效的压缩和加密功能,让软件开发者能方便而且快速地建立绿色、实用、稳定、安全的数据库程序。

 关于TinyDB

软件名称:TinyDB

目前版本:2.0

软件性质:免费软件

开发平台:Windows9x/NT/2000

语言支持:Delphi, C++Builder 5.0 或更高版本

********************

MSHawk(憨憨) (2001-4-26 16:27:00)  得0分

老兄,我这儿有个东西可能能满足你的要求。

unit SingleLinkList;//单链表单元文件

interface

type

 int = integer;

 TSDLinkListRec = class//单链表数据类。

 public

   Next: TSDLinkListRec;

   constructor Create;

 end;

 TSDLinkListMGR = class//单链表管理类。

 private

   FCount: integer;

 public

   Head: TSDLinkListRec;

   constructor Create;

   destructor  Destroy;override;

   function  IndexOf(Index: integer): TSDLinkListRec;

   function  GetIndex(SL: TSDLinkListRec): int;

   procedure Clear;virtual;

   procedure Append(SL: TSDLinkListRec);virtual;

   procedure Insert(Index, SL: TSDLinkListRec);virtual;

   procedure Delete(SL: TSDLinkListRec);virtual;

   procedure MovePrev(SL: TSDLinkListRec);

   procedure MoveNext(SL: TSDLinkListRec);

   property  Count: int read FCount;

 end;

implementation

constructor TSDLinkListRec.Create;

begin

 inherited;

 Next := nil;

end;

constructor TSDLinkListMGR.Create;

begin

 inherited;

 Clear;

end;

destructor  TSDLinkListMGR.Destroy;

begin

 Clear;

 inherited;

end;

function  TSDLinkListMGR.IndexOf(Index: integer): TSDLinkListRec;

var

 T: TSDLinkListRec;

 i: integer;

begin

 i := 1;

 Result := nil;

 T := Head;

 while T <> nil do

 begin

   if i = Index then

   begin

     Result := T;

     Break;

   end;

   T := T.Next;

   Inc(i);

 end;

end;

function  TSDLinkListMGR.GetIndex(SL: TSDLinkListRec): int;

var

 P: TSDLinkListRec;

begin

 Result := 0;

 P := Head;

 while P <> nil do

 begin

   Inc(Result);

   if P = SL then

     Exit;

   P := P.Next;

 end;

 Result := 0;

end;

procedure TSDLinkListMGR.Clear;

var

 T: TSDLinkListRec;

begin

 T := Head;

 while T <> nil do

 begin

   Head := T.Next;

   T.Destroy;

   T := Head;

 end;

 Head := nil;

 FCount := 0;  

end;

procedure TSDLinkListMGR.Append(SL: TSDLinkListRec);

var

 T: TSDLinkListRec;

 C: integer;

begin

 T := SL;

 C := 0;

 while T <> nil do

 begin

   inc(C);

   T := T.Next;            

 end;

 if C = 0 then

   Exit;

 if Head = nil then

   Head := SL

 else

 begin

   T := Head;

   while T.Next <> nil do

     T := T.Next;

   T.Next := SL;

 end;

 inc(FCount, C);

end;

procedure TSDLinkListMGR.Insert(Index, SL: TSDLinkListRec);

var

 T, T1, T2: TSDLinkListRec;

 C: integer;

begin

 C := 0;

 T := SL;

 while T <> nil do

 begin

   inc(C);

   T := T.Next;

 end;

 if C = 0 then

   Exit;

 if Head = nil then

   Head := SL

 else

 begin

   T := Head;

   while T <> nil do

   begin

     if T = Index then

     begin

       T1 := T;

       T.Next := SL;

       T2 := SL;

       while T2.Next <> nil do

         T2 := T2.Next;

       T2.Next := T1;

       Break;

     end;

     T := T.Next;

   end;

 end;

 inc(FCount, C);

end;

procedure TSDLinkListMGR.Delete(SL: TSDLinkListRec);

var

 T: TSDLinkListRec;

begin

 if SL = nil then

   Exit;

 if Head = SL then

 begin

   Head := SL.Next;

   SL.Destroy;

 end

 else

 begin

   T := Head;

   while T <> nil do

   begin

     if T.Next = SL then

     begin

       T.Next := SL.Next;

       SL.Destroy;

       Break;

     end;

     T := T.Next;

   end;

 end;

 dec(FCount);

end;

procedure TSDLinkListMGR.MovePrev(SL: TSDLinkListRec);

var

 P, C: TSDLinkListRec;

begin

 if (SL = nil) or (SL = Head) then

   Exit;

 if Head.Next = SL then

 begin

   C := SL.Next;

   SL.Next := Head;

   Head.Next := C;

   Head := SL;

 end;

 P := Head;

 C := P.Next;

 while (C.Next <> SL) and (C.Next <> nil) do

 begin

   P := C;

   C := C.Next;

 end;

 if C.Next = nil then

   Exit;

 P.Next := SL;

 C.Next := SL.Next;

 SL.Next := C;

end;

procedure TSDLinkListMGR.MoveNext(SL: TSDLinkListRec);

var

 P, C: TSDLinkListRec;

begin

 if SL = nil then

   Exit;

 if Head = nil then

   Exit;

 P := Head;

 C := P.Next;

 while C <> SL do

 begin

   P := C;

   C := C.Next;

 end;

 if C.Next = nil then

   Exit;

 C := SL.Next;

 P.Next := C;

 SL.Next := C.Next;

 C.Next := SL;

end;

end.

以上是一个单链表的完整实现。包括两个类:之一是单链表中的存储数据的类。之二是对此单链表进行管理的类。在管理类中实现了一下操作:

   1、APPEND操作:向链表中添加节点。

   2、INSERT操作:向链表中插入节点。(插入的节点在INDEX节点后面。)

   (注意:以上操作支持多节点。)

   3、DELETE操作:删除链表中的一个节点。

   4、MOVEPREV操作:将一个节点移动到其前一个节点前。

   5、MOVENEXT操作:将一个节点移动到其后一个节点后。

   6、INDEX操作:通过索引方式查找节点。

对此两个类的使用方法如下:

 TUserRec = class(TSDLinkListRec)

 private

   FStatus: TUserStatus;//当前用户状态。

   FUserID: Word;//用户ID。

   FSpeakHandle: THandle;

   procedure SetUserStatus(Value: TUserStatus);

   procedure GeneralUserID;//产生用户ID。

   procedure GeneralComEnCode;//产生用户加密密码。

 public

   UserName: TShortString;//用户名称。

   FullName: TShortString;//用户全名。

   PassWord: TShortString;//用户密码。

   UserLevel: Word;//用户等级。数值越低,则权限越低。数值越高,则权限越高。

   LoginSource: TLoginSource;//登录源。

   LoginComputerUNC: string;//登录源计算机的UNC名。(统一命名规则。)

   LoginTime, LogOffTime, ElapsedTime: string[16];//登录时间、取消登录时间以及登录持续时间。

   ListenComCount, SpeakComCount: Word;//对话计数器。

   ComEnCode: array [0..LenCode - 1] of Byte;//用户加密密码。

   TimeOut, TimeNoLink: int;//客户未连接时间。当此时间减小到零时,将断开客户连接。以秒为单位。

   property Status: TUserStatus read FStatus write SetUserStatus;

   property UserID: Word read FUserID;

   property SpeakHandle: THandle read FSpeakHandle write FSpeakHandle;

   constructor Create;

   destructor  Destroy;override;

   procedure ReadFromFile(var F: Text);

   procedure WriteToFile(var F: Text);

 end;

 TUserMGR = class(TSDLinkListMGR)

   DefaultUser: TUserRec;

   Modifyed: Bool;

   function  FindUserByName(UserName, PassWord: TShortString): TUserRec;

   function  FindUserByDoMain(DoMain: string): TUserRec;

   function  FindUserByLoginSource(S: string): TUserRec;

   function  FindUserByID(ID: DWord): TUserRec;

   procedure ReadFromFile(FileName: string);

   procedure WriteToFile(FileName: string);

   constructor Create;

   destructor  Destroy;override;

 end;

以上的TUserRec类是关于用户的数据类,而TUserMGR类是对此用户链表的管理类。

   在加入用户时,可以这样做:

var

 User: TUserRec;

begin

 User := TUserRec.Create;

 User.UserName := '*****';

 User.FullName := '*****';

 ......

 Users.Append(User);

end;

 

   在删除用户时,可以这样做:

var

 User: TUserRec;

begin

 User := TUserRec(Users.IndexOf(*));

 Users.Delete(User);

end;

   在遍历用户时,可以这样做:

var

 User: TUserRec;

begin

 User := TUserRec(Users.Head);

 while User <> nil do

 begin

   ......

   User := TUserRec(User.Next);

 end;

end;