前面几节内容使用了已知的节(section)和键(Key)来获取值的,
如果是一个不知道里面具体 section和 Key 的ini文件,如何知道有些什么section和 Key 以及对应的值呢?
本节内容正式讨论如何枚举一个ini文件中的节(section)和键值对。
使用到的api函数仍然是GetPrivateProfileString()
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (
ByVal lpApplicationName As String,
ByVal lpKeyName As String,
ByVal lpDefault As String,
ByVal lpReturnedString As String,
ByVal nSize As Integer,
ByVal lpFileName As String) As Integer
在《vb.net 教程 4-12 ini文件操作 1 ini文件的读取》中曾谈到这个函数的用法,参数 lpApplicationName 指定了ini文件节名称,参数 lpKeyName 指定了lpApplicationName 节下的键名称,当这两个参数都设置为 vbNulllString 的时候,就可以通过传入的参数 lpReturnedString 返回一个包含所有节(section)的字符串,其中每个 section 之间用 vbNullChar 隔开,字符串最后是两个 vbNullChar。
同样,当指定了 lpApplicationName 为某节名称的字符串,lpApplicationName 设置为 vbNulllString 的时候,通过传入的参数 lpReturnedString 返回一个包含所有键(Key)的字符串,其中每个 Key 之间用 vbNullChar 隔开,字符串最后是两个 vbNullChar。
以下代码示范了如何将所有节(section)枚举到listbox1:
Dim filename As String
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
filename = "g:\setting.ini"
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim sectionarr() As String
Dim Rvalue As Integer
Dim BufferSize As Integer
BufferSize = 255
Dim sectionnames As String
sectionnames = Space(BufferSize)
Rvalue = GetPrivateProfileString(vbNullString, vbNullString, "", sectionnames, BufferSize, filename)
If Rvalue = 0 Then
MessageBox.Show("发生错误 " & Err.LastDllError)
Exit Sub
End If
sectionnames = sectionnames.Substring(0, Rvalue - 1)
sectionarr = sectionnames.Split(vbNullChar)
For Each section As String In sectionarr
ListBox1.Items.Add(section)
Next
End Sub
以下代码演示当点击listbox1中某一 section 时,在listbox2中显示该 section 中的键和值:
Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
If ListBox1.SelectedIndex < 0 Then
Exit Sub
End If
ListBox2.Items.Clear()
Dim sectionName As String = ListBox1.Items(ListBox1.SelectedIndex)
Dim keyarr() As String
Dim Rvalue As Integer
Dim BufferSize As Integer
BufferSize = 255
Dim keys As String
keys = Space(BufferSize)
Rvalue = GetPrivateProfileString(sectionName, vbNullString, "", keys, BufferSize, filename)
If Rvalue = 0 Then
MessageBox.Show("发生错误 " & Err.LastDllError)
Exit Sub
End If
keys = keys.Substring(0, Rvalue - 1)
keyarr = keys.Split(vbNullChar)
For Each keyname As String In keyarr
Dim keyValue As String
keyValue = Space(BufferSize)
Dim Rvalue1 As Integer
Rvalue1 = GetPrivateProfileString(sectionName, keyname, "", keyValue, BufferSize, filename)
If Rvalue = 0 Then
MessageBox.Show("发生错误 " & Err.LastDllError)
Else
ListBox2.Items.Add(keyname & "=" & keyValue)
End If
Next
End Sub
使用到的范例ini文件内容如下:
[control]
appname=ini文件读写
port=COM4
[setting]
language=中文
port=COM4
[times]
writetime=2019-10-01
readtime=2019-10-10
运行结果如下:
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录