【问题标题】:.NET StreamReader Won't Close.NET StreamReader 不会关闭
【发布时间】:2009-02-12 01:29:17
【问题描述】:

我正在使用 RTF 文件作为 ASP.NET Web 应用程序的模板。我的 VB.NET 代码使用 StreamReader 读取文件,替换一些字符串,并使用数据库中的数据创建一个新的 Word 文档。我的代码关闭并处理了 StreamReader。但是,当我尝试将修改后的 RTF 文件上传到 Web 服务器时,我收到错误消息“无法打开文件进行写入”。因此很明显,在 ASP.NET 页面运行后很长时间该文件仍处于打开状态。

如何强制 StreamReader 关闭?即使编辑 web.config 文件以强制 Web 应用程序重新启动,也不足以取消对该文件的锁定。

【问题讨论】:

  • 如果你关闭并处理这看起来很奇怪,你能粘贴一些示例代码吗?
  • 我同意。这里有流操作吗?
  • 我有一个开发网站,它正在生产网站中打开一个文件。似乎我必须在生产网站中编辑 web.config 以重新启动 Web 应用程序并发布文件,即使它是打开它的开发网站。

标签: asp.net vb.net rtf streamreader


【解决方案1】:

考虑使用“使用”成语,VB.net 中也有

using(StreamReader reader = new StreamReader(...)) {

}

即使抛出异常,流也会关闭

考虑像这样关闭所有 IDisposable 实现

【讨论】:

    【解决方案2】:

    即使在关闭/处置之后它仍然挂起,这似乎很奇怪。您是否将 FileStream 与 StreamReader 一起使用?通常,我使用 FileStream 来控制对文件的访问并将其提供给 StreamReader,例如:

    FileStream fsIn = new FileStream("path",FileMode.Open, FileAccess.Read, FileShare.None);
    StreamReader srIn = new StreamReader(fsIn, System.Text.Encoding.Default);
    
    //...do stuff....
    
    srIn.close();
    srIn.Dispose();
    fsIn.close();
    fsIn.Dispose();
    

    更好的是,如果您将 StreamReader 的使用限制为一种方法,请将 Close/Dispose 粘贴到 finally。

    【讨论】:

    • 我还建议使用“使用”指令。
    • 我能说什么?我是老式的:-)
    • 这让我觉得我从未真正测试过 Dispose() 是否关闭流,但我相信文档!
    【解决方案3】:

    确保流最终关闭。

    FileStream fsIn = null;
    StreamReader srIn = null; 
    
    try
    {
      fsIn = new FileStream("path",FileMode.Open, FileAccess.Read, FileShare.None);
      srIn = new StreamReader(fsIn, System.Text.Encoding.Default);
    
      //...do stuff....
    
    }
    catch (Exception ex)
    {
    }
    finally
    {
      srIn.close();
      srIn.Dispose();
      fsIn.close();
      fsIn.Dispose();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2018-11-10
      • 1970-01-01
      • 2018-07-11
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多