用文件代替DBF了
自行定义一个文件数据结构了,
自行定义一个文件数据结构了,
解决方案 »
- ProjectProject raised exception class EInvalidPointer 'Invalid pointer opertion'
- RMB找人修改个简单的网络程序
- 请教高人关于KOL的问题,搞了一天一夜,实在搞不定了
- 好消息!Delphi 要出中文版了!也会支持Unicode了!
- 急! 百思不解问题!请高手指教
- 为什么有些控件不响应窗口的帮助按扭?
- 为什么每次打开database desktop时会有显示directory is busy
- 请教高手 dephi 一个应用里怎么样关闭另一个一打开的应用?
- delphi操作excel2003,如何获得当前sheet中已用的行和列数?
- delphi移植问题,给高分
- 如何在DELPHI中动态改变端口
- 关于vcl构件安装?
自己定义文件格式的话太累的,而且效率也是一个问题啊.
实际上,我也不知道这个问题该怎么办,但我想,从以下几个方面入手可以有些线索:
1、在文件头或文件尾要写一个文件结构表,用于记录每个字段的类型、字段宽度等,以便
用文件流读出相应的内容,这个文件结构表也用文件流写入。
2、有关索引,考虑写入一个与主文件名称相同,扩展名不同的索引文件中,索引文件的内容也是一个结构表之类的。下面一些代码是写入文件结构表的实现,不能称之为“程序”,但能够揭示一个文件流的操作,至于如果根据文件结构表中的信息读取相应位置的文件,也还有大量的工作要做。此外,我要指出的是数据的亢余是无法消除的,你定义了一个字段的宽度后,此后你每新增一条记录时,即使该字段是空的,没有内容,但它还是要占那么多的空间。我现在还不知道怎么能取消除数据亢余,但如果很容易消除的话,大多数压缩软件就没有生存的理由了。这些代码是刚才写的,在Win98+Delphi 5下调试成功。unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,DB,
StdCtrls;type
TFileRec = record
FieldName : Shortstring; //字段名
FieldType : TFieldType; //字段类型
Size: Longint; //字段尺寸
Value: ShortString; //字段内容
end; TForm1 = class(TForm)
ReadButton: TButton;
WriteButton: TButton;
procedure ReadButtonClick(Sender: TObject);
procedure WriteButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;implementation{$R *.DFM}procedure WriteFileHead(FileName: String);
var FileRec: TFileRec;
FS: TFileStream;
begin
FileRec.FieldName := 'Field1';
FileRec.FieldType := ftString;
FileRec.Size := 28;
FileRec.Value := '这只是一个思路';
FS := TFileStream.Create(FileName,fmCreate or fmOpenWrite);
try
FS.WriteBuffer(FileRec, SizeOf(FileRec))
finally
FS.Free;
end;
end;function ReadFileHead(FileName: String): TFileRec;
var FileRec: TFileRec;
FS: TFileStream;
begin
if not FileExists(FileName) then
begin
ShowMessage('文件“'+FileName+'”不存在!');
Exit;
end;
FS := TFileStream.Create(FileName, fmOpenRead);
try
FS.ReadBuffer(FileRec, SizeOf(FileRec));
Result := FileRec;
finally
FS.Free;
end;
end;procedure TForm1.ReadButtonClick(Sender: TObject);
var FileRec: TFileRec;
FType: String;
begin
try
FileRec := ReadFileHead('C:\FHTest1.txt');
case FileRec.FieldType of
ftString: FType := '字符型,';
ftFloat: FType := '浮点型,';
ftInteger: FType := '整数型,';
ftBlob: FType := '大二进制,';
//等等等……
end;
ShowMessage(FileRec.FieldName+','+FType+'宽度:'+IntToStr(FileRec.Size)+
',“'+AnsiString(FileRec.Value)+'”');
except
end;
end;procedure TForm1.WriteButtonClick(Sender: TObject);
begin
WriteFileHead('C:\FHTest1.txt');
end;end.
我想让更多的人得到我送出的分呀!
肯定给你加个高分!我正在收集意见期间:在这期间给我想办法的大侠均可得到小弟奉上的分!126不算多,但我会不断追加!
要做得好要考虑很多东西的。而且还要有个很好的算法去访问那个个自己的数据库格式。 当时学Foxbase时我就有想过这个问题,如果你还有在Foxbase中用的数据库表(*.dbf)的话你用文本形式打开或许会得到些启发。 有空我还会回来答的。现在真的没时间去想这个问题了。
如果觉得mdb格式太复杂,那么也可以考虑.db, .dbf等文件型数据库。
另外,suzg建议采用xml,也是个不错的注意。
而最终保存的文档就用16进制保存吧!如果不是什么大项目,我想这样已经够了!