You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET获取INI文件中所有DATE键值问题求助

提取INI文件中所有DATE键的数值

我有一个名为self-test-test.ini的配置文件,想要提取所有DATE键对应的数值,但当前编写的VB.NET GetIniValue函数仅能返回第一个DATE值,尝试循环调用该函数也无法获取全部结果。

现有代码

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim passfail = GetIniValue("DATE", "self-test-test.ini", "FAIL")
        RichTextBox3.Text = passfail
End Sub

Private Sub RichTextBox3_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox3.TextChanged
End Sub

Public Function GetIniValue(key As String, filename As String, Optional defaultValue As String = "") As String
        Dim inifile As New StreamReader(filename)
        Dim LineData As String
        Dim textdata() As String
        Dim keydata As String = defaultValue
        Dim done As Boolean = False

        If File.Exists(filename) Then
            Do While Not done
                If inifile.Peek() >= 0 Then
                    LineData = inifile.ReadLine()
                    textdata = Split(LineData, "=")
                    If Trim(textdata(0)) = key Then
                        If UBound(textdata) > 0 Then
                            keydata = Trim(textdata(1))
                        End If
                        done = True
                    End If
                Else
                    done = True
                End If
            Loop
            inifile.Close()
        End If
        GetIniValue = keydata
    End Function
End Class

INI文件内容

[20E2SN5]
DATE=05/01/2019,15:12:12
STATUS=PASS
[20R5SN9]
DATE=06/21/2019,15:13:13
STATUS=PASS

尝试过的循环代码

Dim passfail = GetIniValue("DATE", "self-test-test.ini", "FAIL")
For Each n In passfail
    RichTextBox3.Text += n.ToString
Next

当前结果

05/01/2019,15:12:12

期望结果

05/01/2019,15:12:12
06/21/2019,15:13:13

问题分析

  1. 原GetIniValue函数找到第一个匹配的DATE键后,立即设置done = True终止循环,因此只能获取第一个值。
  2. 原函数返回单个字符串,循环遍历该字符串会逐个输出字符,而非多个匹配值。

解决方案

修改函数使其返回所有匹配的DATE值,以下是调整后的代码:

修改后的获取值函数

Public Function GetAllIniValues(key As String, filename As String, Optional defaultValue As String = "") As List(Of String)
    Dim values As New List(Of String)()
    
    ' 文件不存在时返回默认值
    If Not File.Exists(filename) Then
        values.Add(defaultValue)
        Return values
    End If

    ' 使用Using自动释放资源
    Using inifile As New StreamReader(filename)
        Dim LineData As String
        ' 遍历整个文件直到结束
        While inifile.Peek() >= 0
            LineData = inifile.ReadLine()
            Dim textdata() As String = Split(LineData, "=")
            ' 确保行包含=且键匹配
            If textdata.Length >= 2 AndAlso Trim(textdata(0)) = key Then
                values.Add(Trim(textdata(1)))
            End If
        End While
    End Using

    ' 无匹配项时返回默认值
    If values.Count = 0 Then
        values.Add(defaultValue)
    End If

    Return values
End Function

修改后的按钮点击事件

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dateValues = GetAllIniValues("DATE", "self-test-test.ini", "FAIL")
    ' 将所有值用换行符拼接后显示
    RichTextBox3.Text = String.Join(Environment.NewLine, dateValues)
End Sub

关键修改点

  • 函数返回类型改为List(Of String),用于存储所有匹配的DATE值
  • 移除done变量,遍历整个文件直至结束
  • 使用Using语句自动管理StreamReader资源,避免手动关闭可能引发的问题
  • 增加对行格式的判断,防止无=的行导致索引越界
  • 调用时通过String.Join将多个值用换行符拼接,直接显示在RichTextBox中

内容的提问来源于stack exchange,提问作者EZgraves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:12:07