日志编写器不为每个条目创建新行

Log Writer not creating new line for each entry

我觉得这很简单,但我试过了我不知道有多少种 vbNewLineEnvironment.NewLinesMessage & vbNewLine (or Environment.Newline) 我试过,或者这个网站上有多少页,或者通过 Google 我看过但没有任何效果。

我什至尝试从我所属的 VB.Net discord 频道寻求帮助,他们建议我做同样的事情,并且该过程仍在编写每个新的日志条目连续字符串中前一个的结尾。我的作家在下面。我错过了一些简单的东西吗?

编辑:下面是有效的代码,以防其他人遇到同样的问题。如果您想查看原始代码,请在编辑日志中查看。

Option Explicit On
Imports System.IO

Public Class WriteroLog
    Public Shared Sub LogPrint(sMessage As String)
        Dim AppPath As String = My.Application.Info.DirectoryPath

        If File.Exists($"{AppPath}\Log.txt") = True Then
            Try
                Using objWriter As StreamWriter = File.AppendText($"{AppPath}\Log.Txt")
                    objWriter.WriteLine($"{Format(Now, "dd-MMM-yyyy HH:mm:ss")} – {sMessage}")
                    objWriter.Close()
                End Using
            Catch ex As Exception
                MsgBox(ex)
                Return
            End Try
        Else
            Try
                Using objWriter As StreamWriter = File.CreateText($"{AppPath}\Log.Txt")
                    objWriter.WriteLine($"{Format(Now, "dd-MMM-yyyy HH:mm:ss")} – {sMessage}")
                    objWriter.Close()
                End Using

            Catch ex As Exception
                MsgBox(ex)
                Return
            End Try
        End If
    End Sub
End Class

File.CreateText没有赋值给"objWrite",应该是:

objWriter = File.CreateText($"{AppPath}\Log.Txt")

不太确定这是否是您问题的根源,但这是一个问题。

本质上,您的逻辑是为每次调用此方法重新打开或创建流 "objWriter"。我建议您将 "objWriter" 初始化为 Nothing 并且只定义它是否为 Nothing。

设置为无,如下所示。

Shared objWriter As IO.StreamWriter = Nothing

然后在逻辑上添加检查Nothing。

然后用于将文本追加到指定文件的File.AppendText() method creates a new StreamWriter
请注意,阅读有关此方法的文档,您无需验证文件是否已存在:如果不存在,则会自动创建文件。

作为旁注,在创建路径时,使用 Path.Combine 方法是一件好事:它可以防止路径定义中的错误并处理特定于平台的格式。

您的代码可以简化如下:

Public Shared Sub LogPrint(sMessage As String)
    Dim filePath As String = Path.Combine(Application.StartupPath, "Log.Txt")

    Try
        Using writer As StreamWriter = File.AppendText(filePath)
            writer.WriteLine($"{Date.Now.ToString("dd-MMM-yyyy HH:mm:ss")} – {sMessage}")
        End Using
    Catch ex As IOException
        MsgBox(ex)
    End Try
End Sub