【问题标题】:StreamWriter text file gets created but contains no linesStreamWriter 文本文件已创建但不包含行
【发布时间】:2015-06-05 08:27:10
【问题描述】:

我正在尝试将一些文本行写入 Windows 窗体应用程序中的一个小日志文件,但我看不出为什么没有写入任何行。该文件创建正常,以下所有内容都可以正常执行,但是当我用记事本打开新文件时,没有行。关键 sn-ps 如下:

    Dim sFileName = App_Path() & "\logs\" & sJobName & ".log"
    Try
        Using fs As FileStream = New FileStream(sFileName, FileMode.Append, FileAccess.Write)
            Using w As StreamWriter = New StreamWriter(fs)
                Dim s As String = "Beginning execution (JobName=" & sJobName & ")"
                Log(s, w)
                s = "Connection in effect: " & BuildConnectString()
                Log(s, w)
                Dim loader As New Importer
                loader.LoadData(Me.txtFN.Text, w)
            End Using
        End Using
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

Public Sub Log(logMessage As String, w As StreamWriter)
    w.WriteLine("{0} {1}: {2}", DateTime.Now.ToLongTimeString(), _
        DateTime.Now.ToShortDateString(), logMessage)
End Sub

然后我尝试从另一个类写入此日志,该类已作为参数传递 StreamWriter:

Public Function LoadData(ByRef filename As String, _
                         ByRef w As StreamWriter) As String
    Dim s As String = "Test logging from loader class"
    Mainform.Log(s, w)

在这个小测试中,我希望看到 3 行,但我什么也没得到。我看不出我做错了什么。

【问题讨论】:

  • 这段代码对我有用。代码中可能还有其他内容(您在此处未提及)造成问题。

标签: vb.net winforms filestream streamwriter


【解决方案1】:

它适用于我,但如果代码不适合你,你可以使用这样的代码......

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim sFileName = App_Path() & "\logs\" & sJobName & ".log"
    Try
        Dim s As String = "Beginning execution (JobName=" & sJobName & ")"
        Log(s, sFileName)
        s = "Connection in effect: " & BuildConnectString()
        Log(s, sFileName)
        Dim loader As New Importer
        loader.LoadData(Me.txtFN.Text, sFileName)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Public Sub Log(logMessage As String, StrPath As String)
    IO.File.AppendAllText(StrPath, String.Format("{0} {1}: {2}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToShortDateString(), logMessage) + vbCrLf)
End Sub

Public Function LoadData(ByRef filename As String, _
                     StrPath As String) As String
    Dim s As String = "Test logging from loader class"
    Log(s, StrPath)
End Function

【讨论】:

  • 谢谢!我很好奇你所说的“为我工作......”是什么意思。您是说我在原始帖子中使用 USING 语句的代码对您有效吗?我逐行调试了所有代码,它执行没有错误,但 .log 文件中没有行。
  • 我试过你的代码,它对我“有效”,但我有两个问题。 AppendAllText 的文档声明它“打开一个文件,将指定的字符串附加到文件,然后关闭文件。如果文件不存在,则此方法创建一个文件,将指定的字符串写入文件,然后关闭文件。”。我希望能够根据需要逐行编写,而无需关闭和重新打开文件的开销。其次,我需要将传递给 Log 子的每个字符串作为单独的行写入(即仅附加到文件本身 - 不附加到前一行内容。
  • 是的,我的意思是你的代码正在运行,我看到了文本中的三行,但我不明白你的问题,你能写整个 LoadData 函数吗?
  • 您刚刚在上面发表的非常有帮助的评论。我的原始代码现在可以工作了。我相信我现在对 Using 和 End Using 功能有了更好的理解。我正在使用调试器单步执行代码。在 LoadData 函数中成功执行 Log 方法后,我会单击“End Debugging”,这当然绕过了 End Using 的执行。因此,即使 LoadData 有很多工作要做,我在调用返回到 End Using 的 Log 方法之后添加了一个快速返回,现在一切都很好。我想感谢你帮助我。
  • 请发布一个简短的答案,确认需要 End Using 来“刷新待处理的缓冲区”或任何最好的表达方式。我仍然相信 Streamwriter 的使用比 IO.File.AppendAllText 不断重新打开和关闭日志文件的重复开销要好。如果可以的话,请发布一个简短的答案,以便我给你加分。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 2011-01-30
  • 2017-01-21
  • 2015-10-07
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多