PS:我的资源里面有一个完整的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 = vbNullStringEnd 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 = FalseEnd 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 = TrueEnd Function
该方法在 INI 文件中写入一个键值,成功返回 True,失败返回 False。根据 WritePrivateProfileString 的需要,除了文件名这一参数不用提供之外,需要提供段名、键名和值三个参数,而且这三个参数当然来自用户。而 WritePrivateProfileString 是通过返回值是否为 0 来判断是否成功的,所以可以通过判断 WritePrivateProfileString 的返回值是否非 0 来返回 True 或 False。
而读 INI 就要稍稍麻烦一点了,两个读取 INI 文件的的函数中,读取字符串那个虽然参数多些,但实现起来却更简单,所以,先写这个:
Public Function ReadString(Section 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,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,Inifilename) If ReturnLng = 0 Then ReturnLng = GetPrivateProfileInt(Section,1,Inifilename) If ReturnLng = 1 Then ErrorMsg = "不能读取" Exit Function End If End If ReadInt = ReturnLngEnd Function这个方法在 INI 文件中读取一个整数值,失败时返回 0。考虑到某些键的值也可能为 0,故应结合 ErrorMsg 判断是否成功。 这个方法中调用了两次 GetPrivateProfileInt,为什么要这样呢?因为 GetPrivateProfileInt 如果成功则返回取得的值,如果不成功则返回给定的默认值。这样就会出现一种情况:如果我给的默认值是 0,GetPrivateProfileInt 函数取得的值也是 0,那么它是成功还是失败呢?同样,如果我给的默认值是 1,GetPrivateProfileInt 函数取得的值也是 1,那就是成功还是失败呢?既然一次取值无法判断,那就多取一次,第一次设定默认值为 0,第二次设定默认值为 1,INI 文件的中值不会跟着我的默认值变吧?!虽然这样麻烦一些,但毕竟把问题解决了。 自此,我们终于把一个 CInifile 写完了——现在读写 INI 文件再也不需要像写 CInifile 一样考虑许多东西了,CInifile 已经帮我们做了。 总结
以上是内存溢出为你收集整理的用 VB 写一个类读写 INI 文件全部内容,希望文章能够帮你解决用 VB 写一个类读写 INI 文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)