Почему файл перезаписывается?

Я разрабатываю новое серверное приложение, которое включает в себя подпрограмму, которая, например, анализирует ввод в окно консоли.

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

Это работает, но в файл записывается только последняя строка желаемого ввода.

Почему это происходит, и как мне сделать так, чтобы он не перезаписывал лог-файл? Для этого используется API-интерфейс Wildfire Server.

Это не дубликат, так как у целевого вопроса есть другой ответ, который в противном случае не дал бы ответа на этот вопрос.


person AStopher    schedule 01.06.2015    source источник
comment
Я придумал этот вопрос для бесконечной вереницы новичков, которые снова и снова задают один и тот же вопрос.   -  person AStopher    schedule 01.06.2015
comment
@RowlandShaw Нет, прочитайте целевой вопрос и ответы на него.   -  person AStopher    schedule 02.09.2015


Ответы (1)


Это происходит из-за того, что 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
  • Система.Windows.Forms

Теперь он будет правильно записывать в конец файла, но, тем не менее, отмечено, что stWt.Close() заполнение файла при каждом вызове может вызвать проблемы, поэтому система очередей может быть лучше:

  • Желаемый вывод журнала вставляется в одномерный массив
  • Timer выгружает этот массив в файл журнала каждые, скажем, от пяти до десяти секунд.
  • Когда это сделано, массив очищается
person AStopher    schedule 01.06.2015