2008-06-08 16:38:48
用 VB 写一个类读写 INI 文件
边城狂人
VB,vb.net (2002-03-20 20:34:51)
-------------------------------------------------------------------------
-------
用 VB 写一个类读写 INI 文件
---------------------------
边城狂人
========
INI 文件是什么样子?——不会吧,这都不知道。INI 文件就是 Windows 中常见
的以 .ini 为扩展名的文件,其内部格式和各部分的名称如下:
[Section1]
Key1=Value1
Key2=Value2
Key3=Vlaue3
[Section2]
Key1=Value1
Key2=Value5
Key4=Value4
Key5=...
...
INI 文件中分若干个段 (Section),每个段中有若干个键 (Key) 值 (Value) 对
。一个键值对保存一个信息;段则将属性类似的一些键值对组织在一起。同一个段中不
能出现两次以上同样的键,但不同的段中可以出现相同的键。
现在明白了吗?要是还不明白,就到 Windows 里找两个 INI 文件看看,文本编辑
器就可以打开的。明白了 INI 文件就要开始学习怎样在 VB 中读写 INI 了。
VB 读写 INI 文件,难吗?不难,因为 Windows 已经为我们做好了一切,我们只
需要调用它的 API 函数就可以了。为了读写 INI 文件,我们可能用到以下 API 函数
:
GetPrivateProfileInt
GetPrivateProfileString
WritePrivateProfileString
其中 WritePrivateProfileString 是用来向 INI 文件写信息的,而
GetPrivateProfileInt 和 GetPrivateProfileString 则是用来从 INI 文件中读信息
的,前者用于读取整型数据,后者则用于读取字符串型数据。
上述三个 API 函数在 VB 中的申明和说明如下:
Private Declare Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileIntA" ( _ ' 返回所读取的长整型值
ByVal lpApplicationName As String, _ ' 要读取的段 (Section) 名称
ByVal lpKeyName As String, _ ' 要读取的的键 (Key) 名称
ByVal nDefault As Long, _ ' 指定默认值,如果读取时出错,
则返回该值
ByVal lpFileName As String) As Long ' 指定要读的 INI 文件名
Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" ( _ ' 返回所读取的字符串值的真实长度
ByVal lpApplicationName As String, _ ' 要读取的段 (Section) 名称
ByVal lpKeyName As Any, _ ' 要读取的的键 (Key) 名称
ByVal lpDefault As String, _ ' 指定默认值,如果读取时出错,
则返回该值
ByVal lpReturnedString As String, _ ' 指定接收返回值的字符串变量
ByVal nSize As Long, _ ' 指定允许字符串值的最大长度
ByVal lpFileName As String) As Long ' 指定要读的 INI 文件名
Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" ( _ ' 如果成功返回非 0 值,失败返回 0
ByVal lpApplicationName As String, _ ' 要写入的段 (Section) 名称
ByVal lpKeyName As Any, _ ' 要写入的的键 (Key) 名称
ByVal lpString As Any, _ ' 要写入的值 (Value),以字符串
表示
ByVal lpFileName As String) As Long ' 指定要写的 INI 文件名
我们的目的是要在 VB 中写一个读写 INI 文件的类,所以在 VB 中新建一个工程
,并添加一个类模块 (Class Module),命令类为 CIniFile,并且将上面的申明添加到
类模块中。然后开始为类添加属性和方法。
从上面的注释说明中,我们可以知道,每次调三个 API 之一都需要指定 INI 文件
名。而在我们的 CIniFile 的每一个实例中,应该始终访问同一个 INI 文件,所以属
性之一就是文件名:
Private IniFileName As String
另外,调用 API 的过程中可能会出现错误,那么 CIniFile 应该能提供错误信息
,所以定义一个保存错误信息的变量作为 CIniFile 的第二个属性
Public ErrorMsg As String
由于访问什么段、什么键以及写入什么值都可以通过参数的形式传递给方法,而获
取的值也都可以通过方法的返回值得以,所以不再需要其它属性了。不过在定义方法之
前还需要对属性进行初始化:
Private Sub Class_Initialize()
IniFileName = vbNullString
ErrorMsg = vbNullString
End Sub
为了指定 INI 文件名给 CIniFile,需要定义一个方法:
Public Sub SpecifyIni(FilePathName)
IniFileName = Trim(FilePathName)
End Sub
在每次读写值之前还需要先判断是否已经指定了 INI 文件名,不然读什么写什么啊
?
Private Function NoIniFile() As Boolean
NoIniFile = True
If IniFileName = vbNullString Then
ErrorMsg = "没有指定 INI 文件"
Exit Function
End If
ErrorMsg = vbNullString
NoIniFile = False
End Function
准备工作完成,现在才是重头戏,读写 INI 文件。似乎“写”要简单一些,就先“
写”吧:
Public Function WriteString(Section As String, key As String, Value As
String) As Boolean
WriteString = False
If NoIniFile() Then
Exit Function
End If
If WritePrivateProfileString(Section, key, Value, IniFileName) = 0
Then
ErrorMsg = "写入失败"
Exit Function
End If
WriteString = True
End Function
该方法在 INI 文件中写入一个键值,成功返回 True,失败返回 False。根据
WritePrivateProfileString 的需要,除了文件名这一参数不用提供之外,需要提供段
名、键名和值三个参数,而且这三个参数当然来自用户。而
WritePrivateProfileString 是通过返回值是否为 0 来判断是否成功的,所以可以通
过判断 WritePrivateProfileString 的返回值是否非 0 来返回 True 或 False。
而读 INI 就要稍稍麻烦一点了,两个读取 INI 文件的的函数中,读取字符串那个
虽然参数多些,但实现起来却更简单,所以,先写这个:
Public Function ReadString(Section As String, key As String, Size As
Long) As String
Dim ReturnStr As String
Dim ReturnLng As Long
ReadString = vbNullString
If NoIniFile() Then
Exit Function
End If
ReturnStr = Space(Size)
ReturnLng = GetPrivateProfileString(Section, key, vbNullString,
ReturnStr, Size, IniFileName)
ReadString = Left(ReturnStr, ReturnLng)
End Function
这个方法在 INI 文件中读取一个键值,作为字符串返回。如果参数 Size 给定的
大小不够,将不能返回完整的值串,但不会有任何提示。
写这个函数的关键在 ReturnStr 的初始化和取值上。VB 中是不需要对字符串进行
初始化的,也不需要分配空间。但是这里如果不将它初始化为一个足够长的字符串,就
不能正确返回结果。这和 C 语言的字符串有关,就不多说了。ReturnStr 的取值也需要
有趣,要使用 Left() 函数将其截断。如果不截断,取得的结果字符串就会有 Size 那
么长,除了取得的值以外,其余部分都是用空格填充的。其原因与前面一点相同,与 C
语言的字符串有关。当然 Left() 函数也可以使用 Trim() 代替,效果是一样的。
最后我们不得不面对这个最麻烦的 ReadInt 方法了。它为什么麻烦呢?看看现在的
函数定义就知道了:
Public Function ReadInt(Section As String, key As String) As Long
Dim ReturnLng As Long
ReadInt = 0
ReturnLng = GetPrivateProfileInt(Section, key, 0, IniFileName)
If ReturnLng = 0 Then
ReturnLng = GetPrivateProfileInt(Section, key, 1, IniFileName)
If ReturnLng = 1 Then
ErrorMsg = "不能读取"
Exit Function
End If
End If
ReadInt = ReturnLng
End Function
这个方法在 INI 文件中读取一个整数值,失败时返回 0。考虑到某些键的值也可能
为 0,故应结合 ErrorMsg 判断是否成功。
这个方法中调用了两次 GetPrivateProfileInt,为什么要这样呢?因为
GetPrivateProfileInt 如果成功则返回取得的值,如果不成功则返回给定的默认值。
这样就会出现一种情况:如果我给的默认值是 0,GetPrivateProfileInt 函数取得的
值也是 0,那么它是成功还是失败呢?同样,如果我给的默认值是
1,GetPrivateProfileInt 函数取得的值也是 1,那就是成功还是失败呢?既然一次取
值无法判断,那就多取一次,第一次设定默认值为 0,第二次设定默认值为 1,INI 文
件的中值不会跟着我的默认值变吧?!虽然这样麻烦一些,但毕竟把问题解决了。
自此,我们终于把一个 CIniFile 写完了——现在读写 INI 文件再也不需要像写
CIniFile 一样考虑许多东西了,CIniFile 已经帮我们做了。
- 作者: simon_211 2005年06月2日, 星期四 13:08 回复(0) | 引用(0) 加入博采
在VB应用程序中使用INI文件的一点体会
摘要 结合实例介绍了在VB中调用Windows API函数操作初始化文件的方法和优点
.
关键词 VB Windows API INI文件
一、INI文件概述
Windows INI文件,可解释为Windows初始化文件。它是一种专门用来保存应用程序
初始化信息和运行环境信息的文本文件。例如Windows
3.1中两个著名的INI文件win.ini和system.ini就在Windows启动时定义了Windows环境
中鼠标响应速度、使用的外壳(shell)程序等设置。Windows系统附带的许多应用程序也
都有自己的INI文件,例如控制面板的INI 文件为control.ini,它也同样定义了控制面板
的有关设置。ini文件是一种文本文件,它可以通过Notepad等文本编辑器进行编辑。ini
文件具有特定的格式。一个INI文件是由若干个段(section)组成的,每个段中包含若干关
键字(key)及相应的值(value)。段的格式如下:
[SectionName]
KeyName=Value
其中SectionName和KeyName分别是段名和关键字名,Value为关键字对应的设定值。需要
加以注意的是:
(1)段名必须加以"["和"]",且"["必须在屏幕的第一列;
(2)关键字名也必须从屏幕的第一列开始书写,且后面必须紧跟"=";
(3)可以对文件加以注释,每行注释须以";"开头。
在Windows中,可以通过手工编辑INI 文件来改变应用程序设置。如要想将Windows
的外壳程序改为文件管理器,则可将system.ini中[boot]段下的"shell=progman.exe"
改为"shell=winfile.exe"。有些设置也可以直接在应用程序界面上更改,但实际上也是
通过修改INI文件来保存这些修改的。
二、在VB中操作INI文件的几个Windows API函数
在开发应用程序时,我们可以创建应用程序自己的INI文件,通过INI文件保存应用程
序的一些运行环境信息,然后在程序中读取INI文件中的设置信息并据以处理。一旦程序
的运行环境需要变更,则可以通过直接修改INI文件或在程序中提供专门的界面间接地修
改INI文件来保证程序的可用性。
VB(Visual Basic)语言是近年来十分流行的一种面向对象的编程语言,但VB本身并
不提供操纵INI文件的函数。所幸的是, VB支持DLL(Dynamic Link Library)的调用。(
一个DLL事实上就是一个可供其它支持DLL调用的应用程序调用的外部函数集。)DLL中的
函数称为API(应用编程接口,Application Programming Interface)函数。我们可以通
过调用相应的API函数来实现操纵INI文件的功能。下面列出了相关的API函数及其说明。
在使用这些函数之前,必须首先在VB的模块文件(.bas)中用Declare语句对它们进行声明
。
三、实例分析
下面就笔者参加天津财经学院教学办公自动化(OA)系统开发的实践介绍一下具体的
实现方法。假定项目文件为man.mak,对应的INI文件为man.ini,其部分内容如下:
[数据库]
文件名=\\DEC_LX5120\DB\OA.mdb
[开户银行]
类型数=3
B1=中国人民银行
B2=中国农业银行
B3=中国工商银行
1. 在程序启动时(执行SUB MAIN()和SUB FORM_LOAD()),从man.ini文件中读取相应的
值并进行以后的操作。其中SUB MAIN()中的有关代码如下:
Dim DbName as String*255 '数据库名
Dim n as Integer
'得到INI文件名,INIfileName为一全局变量
INIfileName=App.Path&"\"&app.ExeName&".ini"
'从man.ini中读取数据库文件名
n=GetPrivateProfileString("数据库","文件名","",DbName,Len(DbName),INIfileN
ame)
DbName=Left(DbName,n)
'打开数据库,Db为一全局变量
Set Db=OpenDatabase(DbName)
在FORM_LOAD()过程中,读取了man.ini中有关的内容并加入相应的组合框(Combo Box)列
表中。这里只给出对"[开户银行]"段的相应操作,代码如下:
Dim BankCount as Integer '银行类型数
Dim BankName as String*255 '银行名
Dim i as Integer,n as Integer
'读取原有银行类型数
BankCount=GetPrivateProfileInt("开户银行","类型数",0,INIfileName)
'读取银行名并加入到组合框cmbBank中
For I=1 to BankCount
n=GetPrivateProfileString("开户银行","B"&i,BankName,Len(BankName),INIfileN
ame)
BankName=Left(BankName,n)
cmbBank.AddItem BankName
Next I
2. 在程序中提供了一个专用维护界面,该界面通过操作INI文件的相应内容来实现相应的
修改。
'下面代码实现数据库路径的修改
Dim n as Integer
'txtDbName.Text对应新的数据库文件名
If txtDbName.Text="" Then
MsgBox "数据库文件名不能为空!",MB_ICONSTOP,App.Title
txtDbName.SetFocus
Exit Sub
Else
'修改数据库文件名
n=WritePrivateProfileString("数据库","文件名",txtDbName.Text,INIfileName)
End If
'下面代码往组合框"开户银行"中增加一个新银行
Dim NewBank as String '新银行名
Dim BankCount as Integer '银行类型数
Dim I as Integer,n as Integer
'输入新银行名
NewBank=InputBox("增加开户银行。",App.Title,"")
If NewBank="" Then
MsgBox "银行名不能为空!",MB_ICONSTOP,App.Title
Exit Sub
Else
'判断输入的银行名是否已存在于列表中
For I=0 to cmbBank.ListCount-1
If NewBank=cmbBank.List(i) Then
'存在则终止
MsgBox NewBank&"已存在于列表中!",MB_ICONSTOP,App.Title)
Exit Sub
End If
Next I
'读取原银行类型数
BankCount=GetPriVateProfileInt("开户银行","类型数",0,INIfileName)
'将银行类型数增1
BankCount=BankCount+1
n=WritePrivateProfileString("开户银行","类型数",Str(BankCount),INIfileName
)
'将新银行名写入INI文件中
n=WritePrivateProfileString("开户银行","B"&BankCount,NewBank,INIfileName)
End If
四、结论
综上所述,在实际的VB应用程序开发中,适当地利用INI文件,可以很好地改善程序的
可维护性和可用性。尤其在数据库访问中使用INI文件可使用户在数据库路径改变时免去
修改原代码之苦。在实际开发中,若结合一定的维护界面,也可使应用程序容易维护,增强
友好性。
参考书目:
1. Visual Basic For Windows程序Windows API参考手册 曾志民 张秀茂 等编
科学出版社
2. Visual Basic 3.0 For Windows语言 参考手册 MicreSoft Corporation著
学苑出版社
联系客服