【问题标题】:How to delete a row in one section of INI file using vb.net?如何使用 vb.net 删除 INI 文件的一部分中的一行?
【发布时间】:2020-07-21 23:57:31
【问题描述】:

我正在尝试删除 INI 文件部分内的一行,但在触发删除代码后,INI 文件内容保持不变。 INI 文件的已删除数据似乎没有被删除。

代码:

  <DllImport("kernel32.dll", SetLastError:=True)> _
    Public Shared Function WritePrivateProfileSection( _
        ByVal lpAppName As String, _
        ByVal lpString As String, _
        ByVal lpValue As String, _
        ByVal lpFileName As String) As Boolean
    End Function   

    Public Sub DeleteSection(ByRef sApp As String, ByRef sKey As String)
        Try
            Dim ret As Boolean
            Dim sBuff As New System.Text.StringBuilder
            sBuff.Capacity = 256

            ret = WritePrivateProfileSection(sApp, sKey, "", m_sIniFile)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

用法:

m_ini.DeleteSection("AppName", "AppKey")

这样做的主要目的是删除键及其值。

但问题是删除后,INI文件没有任何变化。

问候,

【问题讨论】:

  • 对于这个问题并不重要,但声明ByRef 的那些方法参数是什么?没有充分的理由会出现这种情况。 ByVal 是默认值是有原因的。
  • 好的,先生。我会改变它。但主要问题仍未解决。

标签: vb.net


【解决方案1】:

编辑:

正如 Jimi 在 cmets 中指出的,WritePrivateProfileString 可以删除密钥。看来您确实应该调用WritePrivateProfileString 而不是WritePrivateProfileSection,第三个参数应该是Nothing 而不是空的String

此外,虽然实际名称在执行时并不重要,但最好在代码中保持一致以避免混淆。因此,参数应按顺序为lpAppNamelpKeyNamelpStringlpFileName。如果您想改用 .NET 风格的命名,请使用 appNamekeyName[string]fileName。您可以使用value 而不是[string] 来避免转义关键字。

原文:

我从来没有使用过,所以我对这个答案并不完全有信心,但据我所知,你正在将WritePrivateProfileSectionWritePrivateProfileString 组合成一个也不起作用的组合。您的函数名为WritePrivateProfileSection,但该函数有三个参数,而不是四个。 WritePrivateProfileString 有四个,但不能满足您的要求。

WritePrivateProfileString 会将值写入键,如果您想清除该键,这很好,但如果您想删除它,那就不对了。 WritePrivateProfileSection 采用单个 String 包含要写入一个部分的所有键和值,因此这是您需要使用的,并且您需要省略要从该 String 中删除的键。

看来您实际上需要做的是读取该部分中的所有键和值,然后从中构造一个String,而忽略要删除的键。然后,您使用 String 调用 WritePrivateProfileSection 以使用修改后的数据覆盖该部分。 GetPrivateProfileSection 函数将获得一个包含所有当前键和值的 String,因此您应该调用它,处理结果,然后将处理后的数据传递给 WritePrivateProfileSection

【讨论】:

  • 如果 OP 真正想要的是删除一个部分中的一个键(如它所显示的那样),则有 WritePrivateProfileString 为此,将 null 作为 lpValue 参数传递。这同样适用于WritePrivateProfileSection,它可以删除整个部分,将现有部分的名称和null 作为lpString 参数传递。
【解决方案2】:

我也推荐使用 WritePrivateProfileString,但你应该声明它是正确的。

' Writes String values
<DllImport("Kernel32.dll", CharSet:=CharSet.Unicode,
           SetLastError:=True, EntryPoint:="WritePrivateProfileStringW")>
Public Shared Function WritePrivateProfileString(
    Section As String,
    Key As String,
    WriteStr As String,
    IniFile As String) As Integer
End Function

在 .NET 中,标准是 Unicode,因此请使用带有 W 结尾(= 宽)的 EntryPoint

然后删除键/条目很容易:

Public Sub DeleteEntry(IniFile As String, Section As String, Key As String)
    WritePrivateProfileString(Section, Key, vbNullString, IniFile)
End Sub

您还可以使用 WritePrivateProfileString 删除完整的部分:

Public Sub DeleteSection(IniFile As String, Section As String)
    WritePrivateProfileString(Section, vbNullString, vbNullString, IniFile)
End Sub

【讨论】:

  • 怎么样,先生,在该部分中,我只想删除一个键及其值?这可能吗?
  • 当然。然后在我的三个代码段中间使用 DeleteEntry 函数。这是此任务的功能。或者,如果您只想使用 WritePrivateProfileString 函数,请在第二个参数处插入键名。
猜你喜欢
  • 2015-10-18
  • 1970-01-01
  • 2016-09-12
  • 2017-01-10
  • 2012-11-05
  • 2010-11-06
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多