【问题标题】:Open/Close Operation Equivalence VB6 / VB.NET打开/关闭操作等效 VB6 / VB.NET
【发布时间】:2018-06-08 16:43:10
【问题描述】:

我正在努力将 VB6 项目的一部分转换为 VB.Net,我遇到了一些代码段问题,因为我似乎无法在 VB.Net 中找到 VB6 代码的替代方案。这是现在有问题的代码块:

Public Sub ProcessError(ByVal strModule As String, ByVal strProcedure As String, _
                        ByVal strDescription As String, ByVal bLogError As Boolean, _
                        ByVal bShowError As Boolean, Optional ByVal strMsg As String)
    On Error GoTo 100
    Dim intFile As Integer: Dim strPathName As String
    strPathName = AddBackSlash(gsLogPath) & gsErrLogName
    If bLogError = True Then
        If GetFileSize(strPathName) > gcuMaxLogFileSize Then
            Call CopyFile(strPathName, strPathName & ".bak")
            Call DeleteFile(strPathName)
        End If
        intFile = FreeFile
        Open strPathName For Append As #intFile
        Write #intFile, Format(Now, "MMM-DD-YYYY HH:MM:SS AMPM"), strModule, strProcedure, strDescription)
        Close #intFile
    End If
    If bShowError Then
        Call Prompt("Error occurred in " & strModule & vbCrLf & "Error Description :" & strDescription, 1, vbRed)
    End If
    Exit Sub
100:
    Close #intFile
End Sub

所以我遇到的问题是:

Open strPathName For Append As #intFile
Write #intFile
Close #intFile

我知道我可能应该使用StreamWriter 对象来代替这些对象,但让我失望的是错误部分。如果抛出错误并转到 100 标记,如果尚未打开或创建 Close #intFile 将如何工作?

对于我在将其移植到这个转换过程中遇到的大多数其他转换烦恼,我最困惑的是,因此感谢您提供任何帮助。感谢您的宝贵时间。

【问题讨论】:

  • Disposable 类可以使用 Using-End Using 块,即使发生异常,它也会自动释放对象。不要使用 GoTo。请改用适当的 Try-Catch。
  • 关于您关于Close 的问题,您的旧代码有效,因为如果引用的文件号未打开,Close #filenumber 语句不会引发错误。如果文件号打开,则关闭,否则将保持关闭状态,不会出错。
  • @LarsTech 是的,我一直在将 GoTo 块转换为正确的 Try/Catch 块以进行错误处理。关于您评论的第一部分,您是说我可以为StreamWriter 设置一个Using 块,如果出现错误,它会自动处理该对象?
  • @Skitzafreak 是的。在幕后,一个 Using-End Using 块设置了一个 Try-Catch-Finally,它确实在 finally 分支中处理对象。

标签: vb.net vb6 vb6-migration


【解决方案1】:

这修复了错误,还更新了许多代码以使用现代 VB.Net 更典型的样式和 API。为此,请确保文件顶部有一个 Imports System.IO 指令。

Public Sub ProcessError(ByVal ModuleName As String, ByVal ProcedureName As String, _
                        ByVal Description As String, ByVal LogError As Boolean, _
                        ByVal ShowError As Boolean, Optional ByVal Message As String)

    If LogError Then
        Dim logFile As New FileInfo(Path.Combine(gsLogPath, gsErrLogName))
        If logFile.Length > gcuMaxLogFileSize Then
            logFile.MoveTo(logFile.FullName & ".bak")
        End If

        Try
            File.AppendAllText(PathName, String.Format("{0:d},""{1}"",""{2}"",""{3}""", DateTime.Now, ModuleName, ProcedureName, Description))
        Catch
        End Try
    End If

    If ShowError Then
        MsgBox(String.Format("Error occurred in {0}{1}Error Description:{2}", ModuleName, vbCrLf, Description))
    End If

End Sub

这里值得指出的是style guidelines published by Microsoft for VB.Net 现在明确建议不要使用匈牙利类型前缀。

【讨论】:

  • 我不想使用匈牙利符号,但是当我不使用时,我的老板会对我大喊大叫:P
  • 如果有帮助...不是我,是微软。他们也发布了 VB6 指南,这些指南确实建议使用匈牙利语。这是该语言的创建者明确的逆转,基于对工具的更新支持,以便以其他方式向开发人员提供此信息。
  • 我知道大声笑。老实说,我讨厌我的老板让我使用匈牙利符号,因为对我来说这只是糟糕的变量符号。您不需要在变量名称前面加上它的数据类型。根据变量名称,数据类型应该很明显。例如,如果我想输入一些额外的字符,我会使用NumOfPlayersNumberOfPlayers 而不是nPlayers。它还有助于使代码逻辑更具可读性。但我无法向大个子解释并让他接受T__T
  • 不确定这是否完全等同于 VB? VB6 版本将以“ANSI”编码写入文件,而 AFAICR VB.Net 将使用 UTF-8。这对于 OP 来说可能无关紧要,具体取决于字符串中可能出现的字符。如果输出使用 ASCII 0-127 范围之外的字符(例如中文、日文等)的文本,这很重要。
【解决方案2】:

如果你只有一行要写,你可以使用为你完成所有工作的内置方法。

Dim inputString As String = "This is a test string."
My.Computer.FileSystem.WriteAllText(
  "C://testfile.txt", inputString, True)

更多帮助:https://docs.microsoft.com/en-us/dotnet/visual-basic/developing-apps/programming/drives-directories-files/how-to-append-to-text-files?view=netframework-4.7.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多