Когда необходимо поддерживать долговременную персистентность через сериализацию, тогда Вы почти всегда должны использовать пользовательский код для поддержки этого и должны явно установить эти serialVersionUID
, поскольку иначе более старая сериализированная версия не будет de-serializable более новым кодом.
Те сценарии уже требуют большого ухода для получения всех корректных случаев, когда класс изменяется, таким образом, serialVersionUID является наименьшим количеством проблем.
, Если Вам не нужно это (т.е. Вы всегда сериализируете и десериализовываете с той же версией класса), тогда можно безопасно пропустить явное объявление, поскольку вычисленное значение удостоверится, что правильная версия используется.
Попробуйте следующее:
Dim strFile As String = "yourfile.txt"
Dim fileExists As Boolean = File.Exists(strFile)
Using sw As New StreamWriter(File.Open(strFile, FileMode.OpenOrCreate))
sw.WriteLine( _
IIf(fileExists, _
"Error Message in Occured at-- " & DateTime.Now, _
"Start Error Log for today"))
End Using
Это должно работать для вас без изменения логики программы (не выводя «Start error» в верхней части каждого файла), как это делают другие ответы :) Не забудьте добавить код обработки исключений.
Dim filePath As String = String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy"))
Dim fileExists As Boolean = File.Exists(filePath)
Using writer As New StreamWriter(filePath, True)
If Not fileExists Then
writer.WriteLine("Start Error Log for today")
End If
writer.WriteLine("Error Message in Occured at-- " & DateTime.Now)
End Using
Не проверяйте File.Exists () таким образом. На самом деле все это слишком сложно. Это должно сделать то, что вам нужно:
Dim strFile As String = $@"C:\ErrorLog_{DateTime.Today:dd-MMM-yyyy}.txt"
File.AppendAllText(strFile, $"Error Message in Occured at-- {DateTime.Now}{Environment.NewLine}")
Получил все до двух строк кода :)
Вы не закрыли файл после его создания, поэтому, когда вы пишете в него, он используется вами. Метод Create открывает файл и возвращает объект FileStream. Вы либо записываете в файл с помощью FileStream, либо закрываете его перед записью в него. Я бы посоветовал вам использовать вместо этого метод CreateText в этом случае, поскольку он возвращает StreamWriter.
Вы также забыли закрыть StreamWriter в случае, когда файл не существовал, поэтому он, скорее всего, все еще будет заблокирован, когда вы попытаетесь записать в него в следующий раз. И вы забыли записать сообщение об ошибке в файл, если он не существует.
Dim strFile As String = "C:\ErrorLog_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt"
Dim sw As StreamWriter
Try
If (Not File.Exists(strFile)) Then
sw = File.CreateText(strFile)
sw.WriteLine("Start Error Log for today")
Else
sw = File.AppendText(strFile)
End If
sw.WriteLine("Error Message in Occured at-- " & DateTime.Now)
sw.Close()
Catch ex As IOException
MsgBox("Error writing to log file.")
End Try
Примечание: Когда вы перехватываете исключения, не перехватывайте Exception базового класса, перехватывайте только те, которые подходят. В этом случае это будут те, унаследованные от IOException.
Почему бы просто не использовать следующий простой вызов (с любой добавленной обработкой исключений)?
File.AppendAllText (strFile, «Начать журнал ошибок на сегодня»)
РЕДАКТИРОВАТЬ ОТВЕТ
Это должно полностью ответить на вопрос!
If File.Exists(strFile)
File.AppendAllText(strFile, String.Format("Error Message in Occured at-- {0:dd-MMM-yyyy}{1}", Date.Today, Environment.NewLine))
Else
File.AppendAllText(strFile, "Start Error Log for today{0}Error Message in Occured at-- {1:dd-MMM-yyyy}{0}", Environment.NewLine, Date.Today)
End If