问题描述
我正在编写一个程序,该程序在代码的不同位置(例如,不同的子例程,函数或子例程的不同部分(分散))将数据写入文本文件。
首先,我Dim
是文件编写器:
Dim CurrentHisWriter As System.IO.StreamWriter
我告诉它写在哪里:
CurrentHisWriter = New System.IO.StreamWriter("C:\ProgramData\Japanese Conjugation Helper\LastSearch.txt")
然后,我实际上写东西:
CurrentHisWriter.Writeline("thing to write")
问题是我必须更改为另一个子例程,然后继续写入文件,所以我必须关闭编写器,然后在另一个子例程中将另一个变暗:
CurrentHisWriter.Close
NewSubroutine()
[NewSubroutine]:
Dim CurrentHisWriter As System.IO.StreamWriter
CurrentHisWriter = New System.IO.StreamWriter("C:\ProgramData\Japanese Conjugation Helper\LastSearch.txt")
但是当我这样做时,我给了我几个错误之一:
有什么可靠的方法可以对文件进行编程,而不必担心在每次更改子例程时都会关闭写入器。我不确定对象和实例的工作方式,因此,我现在唯一能做的就是在使用“ CurrentHisWriter.Writeline”的每一行上进行一个catch循环,但这实际上也行不通。
我知道我对此一无所知无助于解释,但我尽了最大努力。
解决方法
天真的方法是:
Sub Main()
MethodA()
MethodB()
End Sub
Sub MethodA()
Log("Starting method A")
End Sub
Sub MethodB()
Log("Starting method B")
End Sub
Sub Log(message as String)
System.IO.File.AppendAllText("C:\temp\my.log",message)
End Sub
File.AppendAllText非常擅长关闭事物,因此您可以随后在其他位置写入它
一种更好的方法是让一个类的工作是构建该文件,然后将其全部构建到stringbuilder中,然后将其写入一次。您的多个方法都使用该类,构建该文件...该类可以实现一些定时/定期将数据转储到磁盘上(例如,就像日志记录一样,永无止境,每秒数千个事件..但是也许您会只是使用日志记录框架而不是重新发明轮子),或者它具有将其渲染保存到磁盘的write方法。
如果您的数据还有另一个专门的应用程序在工作,例如,如果您正在生成XML或JSON,则应该查看针对这些数据(已经发明的轮子)的特定序列化方法
,我用
FileOpen(1,"file.txt",OpenMode.Append)
现在您可以从任何其他子例程中编写
PrintLine(1,"text to write")
直到文件关闭
FileClose(1)
但是也许您可以这样解决您的问题:
在子例程之外将CurrentHisWriter定义为
Private CurrentHisWriter As System.IO.StreamWriter = ...
。
然后,您不必关闭并重新打开编写器,您所有的Subs和功能都可以访问它。