如何正确使用StreamWriter类?

时间:2012-07-13 08:57:45

标签: c# streamwriter

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

例如我是否需要将其放入try catch finally块?

StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);

File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();

5 个答案:

答案 0 :(得分:30)

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

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#编译器通过将编写器用法包装到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();
}

手动实现之间的唯一区别是空检查,并且调用方法Dispose而不是Close。但实际上,当您致电Close()Dispose()时,将执行相同的代码:

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

您可以在Dispose method implementation上阅读更多内容。

答案 1 :(得分:6)

您应该使用using语句:

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

在使用块结束时,将调用StreamWriter.Dispose,无论是异常还是代码都成功运行。

答案 2 :(得分:5)

您想使用:

  using (StreamWriter sr = new StreamWriter(streamFolder))
  {
      sr.Write(details); 

      File.SetAttributes(streamFolder, FileAttributes.Hidden); 
  }

您不需要Close

答案 3 :(得分:5)

将其包裹在using

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

确保您的命名很好,因此streamFolder应该是fName。如果您觉得可以处理一些IO(或其他)异常,也可以将此代码放入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();
}

答案 4 :(得分:-2)

System.IO.StreamWriter是System.IDisposable

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