我正在编写一个小应用程序,我希望将操作结果写入文件。
基本上我想要做的是打开一个文件流(我正在考虑 FileStream ,但我愿意接受建议),将数据写入文件,然后在以后关闭它
所以我有一个名为 ReportFile 的课程,方法是:
.Create( string path )
.WriteInfo( string a, string b, string c ) ; //Or something like this...
//Then sometime in the future
.Close()
所以使用 ReportFile 类的类将创建一个实例,多次调用WriteInfo(..)
直到完成它需要做的任何事情,然后在某些地方调用Close()
指出未来。
现在我知道我需要在 ReportFile 类上实现一个Dispose模式,以确保在任何情况下screwey都能正确处理文件的句柄。
但是到目前为止我还没有能够在interweb上找到任何保持文件打开然后检查是否需要关闭的好方法,大多数示例只是打开文件进行写作,然后关闭它 - 所有这些都在using{}
构造内。
在 ReportFile 类中,我希望能够检查FileStream实例是否未关闭,以便我可以关闭它并释放资源。
任何人都知道参考或任何其他建议的良好链接?
(哦,我应该提到我不做C#全职,这只是一个爱好的事情,所以如果这是一个愚蠢的问题,我的道歉; - )
答案 0 :(得分:3)
ReportFile
只有一个TextWriter
实例变量 - 您可以在自己的Dispose()
方法中进行处理。
为什么你想要一个明确的Close()
方法,顺便说一下?您的呼叫者无论如何都应该使用using
声明,那么他们为什么还要明确地呼叫Close
?
答案 1 :(得分:3)
是否有特殊原因需要保持文件打开?
在这种情况下,我只是每次使用FileMode.Append打开文件(或者将append = true传递给StreamWriter ctor),然后使用using再次关闭它。例如:
void WriteInfo(string text)
{
// Second parameter to StreamWriter ctor is append = true
using(StreamWriter sw = new StreamWriter(logFilePath, true))
{
sw.WriteLine(text);
}
}
采用这种方法,您可能不需要Create()或Close()方法。如果文件不存在,append = true将创建文件。
答案 2 :(得分:1)
Justa,我认为你有点过分思考这个功能。你看到使用using结构的例子的原因是使用{}和文件写是非常快速和安全的。
您可能无法每秒多次打开和关闭文件,因此无需始终保持打开状态,从而有可能在不关闭文件的情况下离开应用程序(事后PITA需要修复) 。)使用using结构可以确保资源(在这种情况下是您的文件)被正确释放和关闭。
另一条编程建议:一开始就不要担心效率。首先以最简单的方式使其工作,并在以后必要时提高速度/性能。
答案 3 :(得分:1)
public void Create(string path){ mStream = new FileStream(path); }
public void Dispose(){ if(mStream!= null) mStream.Dispose(); }
答案 4 :(得分:0)
我建议使用“使用”构造,并在保存时保持文件打开。
一个想法可能是在内存中构建内容,然后在准备好时保存它。例如,使用StringBuilder。
答案 5 :(得分:0)
如果你只是不使用using {}结构,你可以使用IDisposable接口:http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx