关闭文件而不使用

我有一个类从一个文件流中读取数据并写入另一个文件流。 我关注在closeFiles()处理完成后关闭流。

你如何处理一个流的处理可能引发exception停止处理另一个流的可能性。

我应该近距离呼叫并处理流或只是一个?

如果我从流处理中捕获任何错误然后继续移动和删除文件会发生什么,如lastOperation()中所示?

在一个完美的世界中,我想在c ++样式初始化列表中使用using语句,但我很确定在c#中不可能。

编辑 :感谢快速反应的人。 所以我应该做的是从IDisposable派生,然后更改构造函数并添加这样的两个处理方法?:

~FileProcessor() { Dispose(true); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { sw.Flush(); } closeFiles(); disposed = true; } } 

这基本上就是我在做的事情:

 class FileProcessor { private string in_filename; private string out_filename; private StreamReader sr; private StreamWriter sw; bool filesOpen = false; public FileProcessor(string filename) { in_filename = filename; out_filename = filename + ".out"; openFiles(); } ~FileProcessor() { closeFiles(); } private void openFiles() { sr = new StreamReader(in_filename); sw = new StreamWriter(out_filename); filesOpen = true; } private void closeFiles() { if (filesOpen) { sr.Close(); sw.Close(); sr.Dispose(); sw.Dispose(); filesOpen = false; } } /* various functions to read, process and write to the files */ public void lastOperation() { closeFiles(); File.Delete( in_filename ); Directory.Move(out_filename, outdir + out_filename); } } 

您的FileProcessor类不应该有析构函数。 它没用,但价格昂贵。

它应该有一个Dispose() (并实现IDisposable接口)来调用closeFiles()。

就像@marcelo回答一样,Stream.Dispose()不应该抛出。 您可以依赖此BCL课程。

但是你应该检查每个Reader / Writer是否为null,以防第一个打开但第二个失败:

 if (sr != null) sr.Dispose(); if (sw != null) sw.Dispose(); 

您的filesOpen不能同时涵盖两者。

我认为如果你在其中使用IDisposable对象,让你的类实现IDisposable接口是一个好习惯。

然后,您应该确保在Dispose()实现中不抛出exception。 如果您处置的每个对象都提供此保证,您的客户将是安全的。

Dispose方法永远不应该抛出exception。 甚至还有一个代码分析工具警告 。

在C#中,确实存在using 。 提供给using语句的对象必须实现IDisposable接口。 此接口提供Dispose方法,该方法应释放对象的资源。

如果您的StreamReader和StreamWriter实现了IDisposable,您可以将它们放在一个使用块中,当您完成它们时它们将被彻底处理掉。

 using(var sr = new StreamReader(in_filename)) { // Perform reader actions } // Reader will now be disposed.