DBF文件格式详细说明及程序设计Word下载.docx
- 文档编号:21487682
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:19
- 大小:112.31KB
DBF文件格式详细说明及程序设计Word下载.docx
《DBF文件格式详细说明及程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《DBF文件格式详细说明及程序设计Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
1个字节
表示当前的版本信息:
∙0x02FoxBASE
∙0x03FoxBASE+/DbaseIIIplus,nomemo
∙0x30VisualFoxPro
∙0x31VisualFoxPro,autoincrementenabled
∙0x43dBASEIVSQLtablefiles,nomemo
∙0x63dBASEIVSQLsystemfiles,nomemo
∙0x83FoxBASE+/dBASEIIIPLUS,withmemo
∙0x8BdBASEIVwithmemo
∙0xCBdBASEIVSQLtablefiles,withmemo
∙0xF5FoxPro2.x(orearlier)withmemo
∙0xFBFoxBASE
1-3
3个字节
表示最近的更新日期,按照YYMMDD格式,以1900年为起始,即第一个字节表示文件最后保存时的年份-1900,第二个字节的值为保存时的月,第三个字节的值为保存时的日。
4-7
Int32
文件中的记录条数,即表格的行数。
8-9
Int16
文件头中的字节数,在此之后的字节为表格记录数据
10-11
一条记录中的字节长度,即每行数据所占的长度
12-13
2个字节
保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。
14
表示未完成的操作。
15
dBASEIV编密码标记。
16-27
12个字节
保留字节,用于多用户处理时使用。
28
DBF文件的MDX标识。
在创建一个DBF表时,如果使用了MDX格式的索引文件,那么DBF表的表头中的这个字节就自动被设置了一个标志,当你下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX文件。
29
页码标记.
30-31
32-N
(x*32)个字节
这段长度由表格中的列数(即字段数,FieldCount)决定,每个字段的长度为32,如果有x列,则占用的长度为x*32,这每32个字节里面又按其规定包含了每个字段的名称、类型等信息,具体见下面的表。
N+1
作为字段定义的终止标识,值为0x0D。
每个字段定义格式如下表,每个字段定义都用32个字节来完成:
0-10
11个字节
字段的名称,是ASCII码值。
11
字段的数据类型,为ASCII码值。
每个值对应不同的字段数据类型,如N表示数值,C表示字符串,关于具体的数据类型说明见下表。
12-15
4个字节
保留字节,用于以后添加新的说明性信息时使用,默认为0。
16
字段的长度,表示该字段对应的值在后面的记录中所占的长度。
17
字段的精度。
18-19
20
工作区ID。
21-31
字段数据类型:
代码
数据类型
允许输入的数据
B
二进制型
各种字符。
C
字符型
D
日期型
用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。
G
(GeneralorOLE)
N
数值型(Numeric)
-.0123456789
L
逻辑型(Logical)
?
YyNnTtFf(?
表示没有初始化)。
M
(Memo)
2DBF文件数据结构实例分析
下面以一个具体实例来分析DBF数据结构:
该表格数据为:
列1
列2
1
2
4
3
6
8
5
10
12
7
9
18
用UltraEdit打开该dbf文件,其内容如下:
现在先分解一下,找出文件头,并分析一下文件头的内容。
首先看第一个字节,值为03,这个是16进制的数据,第一个字节表示数据库类型,值03即0x03,对应FoxBASE+/DbaseIIIplus,。
然后看第4个字节到第7个字节,这一段表示文件中的记录条数,即表格的行数,其Byte值为0A000000,转换成Int32即为10,即表格的行数为10。
关于Byte数组转换成数值类型,其代码如下:
///<
summary>
///将字节组转换成为整型
///<
/summary>
paramname="
tempBytes"
>
字节数组<
/param>
returns>
<
/returns>
publicstaticInt32ConvertBytesToInt32(byte[]tempBytes)
{
Int32result=System.BitConverter.ToInt32(tempBytes,0);
returnresult;
}
接着看第8个和第9字节,其值为6100,转换成Int16其值即为97,意思就是说文件头所占字节长度为97,所以文件头的范围就是下面红色框内:
蓝色框为左边红色框对应的值,这个仅供参考。
下面来仔细分析红色框中的数据:
前面的第1个字节到第8个和第9个字节我们前面都已经分析过了。
第10和11个字节对应值表示一行数据的长度,其值为1300,转换为Int其值为19,即每行数据占19个字节的长度,这个值应该等于接下来定义字段长度之和+1(每行最前面还有一个16进制值为20的字节)。
接下来的从第12个到31个都为保留字节,可以不管。
因为前面已知文件头的长,为97,而用于文件头定义就占了32个,文件头最后一个字节用于表示字段定义结束,也占了一个,于是就只剩下97-32-1=64,而每定义一个字段占32个字节,所以就只有2个字段。
第一个字段就是从第33个字节开始到第33+32个字节,如下面黄色框中:
下面参考第三个表来分析这段数据,已知从第0开始到10这11个字节表示的字段的名称,将这11个字节数组转换成字符串即为字段名称。
将字节数组转换成字符串代码如下:
///将字节组转换成为字符串
publicstaticstringConvertBytesToString(byte[]tempBytes)
stringresult=System.Text.Encoding.GetEncoding("
gb2312"
).GetString(tempBytes);
将第0到第10个字节值转换成字符串,其值为“列1”,即第一个字段的名称。
第11个字节为字段数据类型,该值为4E(上图中用绿色标出),转换为char即为N,N表示数值类型,即第一列的数据类型为数值类型。
第12个到第15个为保留字节,暂不管。
第16个字节表示字段的长度,其值为09(上图中用绿色标出),转换为Int其值即为9,即表示该字段长度为9个字节。
后面从第17到31个字节都可暂不管。
这样就分析完了一个字段的定义,安装同样的思路分析第二个字段,可以得到第二字段名称为“列2”,字段类型也为数值类型(N),字段长度也为9个字节。
如下图所示,注意绿色框中的数据:
在第二个字段定义完成后,接下来的一个字节值为0D,即表示结束了字段定义,刚好在此也是97个字节。
从第98个字节开始就是表格的数据对象了,每行占19个字节,其中第一个字节值为20,不属于表格单元的值,即从第99个字节开始,前面9个字节对应的值为第一行第一列单元的值,接着的9个字节是第一行第二列单元的值,在接下来的一个字节为默认字节,接着的9个字节就是第2行第一列单元的值,接下来的9个字节就是第2行第2列单元的值,依次类推,直到结束位置。
3DBF文件读取与写入程序设计
下面介绍使用程序来读取和写入DBF文件:
首先新建一个窗体项目,各主要控件如下图所示:
3.1读取DBF文件
读取DBF文件的内容并写到一个DataGridView控件中,采用如下函数:
///<
///读取DBF文件
filepath"
DBF文件路径<
dataGridView"
DataGridView控件<
privatevoidReadDBFFile(stringfilepath,DataGridViewdataGridView)
{
try
dataGridView.Rows.Clear();
dataGridView.Columns.Clear();
//打开文件
FileStreamfs=newFileStream(filepath,FileMode.Open,FileAccess.Read);
BinaryReaderbr=newBinaryReader(fs);
//跳过前面4个
br.ReadBytes(4);
//文件中的记录条数,即行数
introwCount=br.ReadInt32();
//4
//文件头的长度
intheadLength=br.ReadInt16();
//2
//每行的长度
introwLength=br.ReadInt16();
//2
//计算字段数目
intcolumnCount=(headLength-33)/32;
//跳过32-4-4-2-2=20个,直接到32
br.ReadBytes(20);
inti,j;
byte[]tempBytes=null;
bytetempByte;
int[]fieldLength=null;
//添加表格的列
if(columnCount>
0)
stringtempColumnName;
fieldLength=newint[columnCount];
for(i=0;
i<
columnCount;
i++)
//读取前11个,为列名称
tempBytes=br.ReadBytes(11);
tempColumnName=ConvertBytesToString(tempBytes);
dataGridView.Columns.Add(tempColumnName,tempColumnName);
//跳过5个
br.ReadBytes(5);
//获取字段长度
tempByte=br.ReadByte();
fieldLength[i]=(int)tempByte;
//跳过剩下的字节,有32-11-5-1=15个
br.ReadBytes(15);
//获取文件头的最后一个字节,值应该为0D
if(tempByte==0x0D)
//添加表格的行及数据
if(rowCount>
stringtempStr;
rowCount;
dataGridView.Rows.Add();
//每行数据中第一个20,跳过
br.ReadByte();
for(j=0;
j<
j++)
tempBytes=br.ReadBytes(fieldLength[j]);
tempStr=ConvertBytesToString(tempBytes);
dataGridView[j,i].Value=tempStr;
}
else
MessageBox.Show("
文件头定义出现错误!
"
"
提示!
MessageBoxButtons.OK,MessageBoxIcon.Warning);
br.Close();
fs.Close();
catch(Exceptionexcept)
MessageBox.Show(except.Message,
}
///将字节组转换成为字符串
publicstaticstringConvertBytesToString(byte[]tempBytes)
///将字节组转换成为整型
publicstaticInt32ConvertBytesToInt32(byte[]tempBytes)
returnresult;
所以,在按钮“读取DBF文件button1”的单击事件添加调用上面读取DBF文件的代码:
privatevoid读取DBF文件button1_Click(objectsender,EventArgse)
if(File.Exists(filepathtextBox1.Text))
ReadDBFFile(filepathtextBox1.Text,dataGridView1);
3.2写入DBF文件
同样,编写用于存储DBF文件的函数,如下:
///保存DBF文件
DBF文件保存路径<
表格对象<
privatevoidWriteDBFFile(stringfilepath,DataGridViewdataGridView)
{
try
{
introwCount=dataGridView.RowCount;
intcolumnCount=dataGridView.ColumnCount;
0&
&
columnCount>
0)
FileStreamfs=newFileStream(filepath,FileMode.Create,FileAccess.Write);
BinaryWriterbw=newBinaryWriter(fs);
byte[]tempBytes;
inti,j,tempInt;
int[]fieldLength=newint[columnCount];
inttempMax=0;
i++)
tempMax=0;
j++)
if(dataGridView[i,j].Value!
=null
&
dataGridView[i,j].Value.ToString()!
="
)
if(dataGridView[i,j].Value.ToString().Length>
tempMax)
tempMax=dataGridView[i,j].Value.ToString().Length;
fieldLength[i]=tempMax*2;
//写入文件头
//第0个字节为数据库类型
tempByte=0x03;
bw.Write(tempByte);
tempBytes=newbyte[3];
//第1个字节为保存时的年份-1990
tempInt=DateTime.Now.Year-1900;
tempBytes[0]=System.Convert.ToByte(tempInt);
//第2个字节为保存时的月份
tempBytes[1]=System.Convert.ToByte(DateTime.Now.Month);
//第3个字节为保存时的日
tempBytes[2]=(byte)(DateTime.Now.Day);
bw.Write(tempBytes);
//第4-7个字节为行数
bw.Write(rowCount);
//第8-9字节为文件头的长度
tempInt=33+columnCount*32;
bw.Write((Int16)tempInt);
//第10-11为每行数据所占长度
tempInt=1;
tempInt+=fieldLength[i];
//第12-31为保留字段,默认为0
tempBytes=newbyte[20];
//开始写字段
tempColumnName=dataGridView.Columns[i].Name;
tempBytes=ConvertStringToBytes(tempColumnName,11);
//第11个字节为数据类型
tempByte=(byte)('
C'
);
//数据类型为字符串
//第12-15为保留字节
tempBytes=newbyte[4];
//第16个字节为字段长度
tempByte=(byte)fieldLength[i];
//接着第17-31都为保留字节
tempBytes=newbyte[15];
//最后以0D结尾
tempByte=0x0D;
objecttempValue;
//写入单元格数据
//每一行第一个字节默认为20
tempByte=0x20;
tempValue=dataGridView[j,i].Value;
if(tempValue!
=null)
tempBytes=ConvertStringToBytes(tempValue.ToString(),fieldLength[j]);
else
tempBytes=ConvertStringToBytes("
fieldLength[j]);
bw.Close();
表格中没有数据"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DBF 文件格式 详细 说明 程序设计