为什么文件被覆盖?

Why is the file being overwritten?

我正在设计一个新的服务器应用程序,其中包括一个将输入解析到控制台的子例程 window,例如

LogAlways("--- CPU detection ---")

将写成:

[net 21:8:38.939] --- CPU detection ---

这是子程序:

Public Sub LogAlways(ByVal input As String)
    Dim dm As String = "[net " + Date.Now.Hour.ToString + ":" + Date.Now.Minute.ToString + ":" + Date.Now.Second.ToString + "." + Date.Now.Millisecond.ToString + "] "
    Console.WriteLine(dm + input)
    Dim fName As String = Application.StartupPath() + "\LogBackups\" + Date.Now.Day.ToString + Date.Now.Month.ToString + "" + Date.Now.Year.ToString + ".log"
    Dim stWt As New Global.System.IO.StreamWriter(fName)
    stWt.Write(dm + input)
    stWt.Close()
End Sub

这有效,但是只有我所需输入的最后一行被写入文件。

为什么会发生这种情况,我怎样才能让它不覆盖日志文件? 这是使用 Wildfire 服务器 API.

这不是重复的,因为目标问题有不同的答案,否则不会回答这个问题。

这是因为 StreamWriter 没有被告知 将输出追加到文件末尾,参数设置为 True、Visual Studio实际上将其作为 StreamWriter 的一个版本提供:

要正确声明它:

Dim stWt As New Global.System.IO.StreamWriter(fName, True)

或在子程序中:

Public Sub LogAlways(ByVal input As String)
    Dim dm As String = "[net " + Date.Now.Hour.ToString + ":" + Date.Now.Minute.ToString + ":" + Date.Now.Second.ToString + "." + Date.Now.Millisecond.ToString + "] "
    Console.WriteLine(dm + input)
    Dim fName As String = Application.StartupPath() + "\LogBackups\" + Date.Now.Day.ToString + Date.Now.Month.ToString + "" + Date.Now.Year.ToString + ".log"
    Dim stWt As New Global.System.IO.StreamWriter(fName, True)
    stWt.Write(dm + input)
    stWt.Close()
End Sub

要求如下Imports:

  • System.IO
  • System.Windows.Forms

它现在可以正确地写入文件末尾,但是请注意,每次调用stWt.Close()'ing 文件可能会导致问题,因此排队系统可能更好:

  • 期望的日志输出被插入到一维数组中
  • A Timer 每隔五到十秒将此数组转储到日志文件
  • 完成后,数组被清除