vb.net 教程 4-12 ini文件操作 4 枚举节、键和键值

前面几节内容使用了已知的节(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 教程 目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值