如何正确使用StreamWriter类?

我正在使用StreamWriter类进行文件操作,这段代码中是否有任何我没有看到的问题?

比如我需要把它放到try catch finally块中吗?

 StreamWriter sr = new StreamWriter(streamFolder); sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); sr.Close(); 

您的代码有什么问题? 如果在关闭流之前发生某些exception,则流将保持打开状态,并且不会释放系统资源:

 StreamWriter sr = new StreamWriter(streamFolder); sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); sr.Close(); 

因此,您需要确定该流将被关闭。 这可以通过try...finally块来实现:

 StreamWriter sr = new StreamWriter(streamFolder); try { sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); } finally { sr.Close(); } 

但StreamWriter实现了IDisposable接口,因此您可以让C#编译器通过将writer使用包装到using块中来自动执行:

 using(StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); } 

此代码将编译为:

 StreamWriter sr = new StreamWriter(streamFolder); try { sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); } finally { if (sr != null) sr.Dispose(); } 

手动实现之间的唯一区别是null-check和方法Dispose被调用而不是Close 。 但实际上,当您调用Close()Dispose()将执行相同的代码:

 this.Dispose(true); GC.SuppressFinalize(this); 

您可以阅读有关Dispose方法实现的更多信息。

您应该使用using语句:

 using (StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); } 

在using块的末尾,将调用StreamWriter.Dispose,无论是exception还是代码成功运行。

你想用:

  using (StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); } 

你不需要Close

将其包裹在using块中

 using(StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); } 

确保你的命名很好,所以streamFolder可能应该是一个fName 。 如果您觉得可以处理一些IO(或其他)exception,也可以将此代码放入try-catch-finally:

 StreamWriter sr; try { sr = new StreamWriter(streamFolder); sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); } catch(IOException ex) { //handling IO } finally { if (sr != null) sr.Dispose(); } 

System.IO.StreamWriter是System.IDisposable

你必须处理它。 你为什么要关闭一些你不打开的东西?