10

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

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

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

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

5 回答 5

37

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

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();
}

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

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

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

于 2012-07-13T09:12:48.717 回答
7

您可能应该使用 using 语句:

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

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

于 2012-07-13T09:00:38.170 回答
5

你想使用:

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

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

你不需要Close.

于 2012-07-13T09:00:02.217 回答
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();
}
于 2012-07-13T09:01:23.153 回答
-2

System.IO.StreamWriter 是一个 System.IDisposable

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

于 2012-07-13T09:01:08.423 回答