日志编写器不为每个条目创建新行
Log Writer not creating new line for each entry
我觉得这很简单,但我试过了我不知道有多少种 vbNewLine
、Environment.NewLine
、sMessage & 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
我觉得这很简单,但我试过了我不知道有多少种 vbNewLine
、Environment.NewLine
、sMessage & 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