FileStream.Dispose是否足够?

时间:2010-11-09 23:19:22

标签: c# file-io .net-4.0 locking dispose

我正在使用FileStream和StreamReader类,如下所示:

using(FileStream stream = File.Open(filePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
{
    using(var reader = new StreamReader(stream))
    {
        content = reader.ReadToEnd();
    }                    
}

这意味着我正在处理它们。

然而,通过运行另一个应用程序,我发现在我正在阅读的文件中存在某种锁定。

除了Dispose我应该调用Finalize还是Close?

喝彩!

更新 - 为什么我认为有一个锁定正在进行:

我有一个写入一些日志文件的服务。

上面的代码来自另一个读取日志的WCF应用程序。

我还有一个自动部署项目,它停止主服务,备份文件,添加新版本的服务,然后重新启动。

如果WCF服务正在运行(包含上面的代码),即使主服务已经停止(写入日志的服务),我也会在运行部署应用程序时遇到IO异常。

当WCF服务没有运行时,我没有IO异常,我可以安全地移动文件。

WCF所做的唯一IO就是......所以我假设它在某处保留了一些锁......?

2 个答案:

答案 0 :(得分:8)

不需要在流上调用close主要是因为读者的dispose方法无论如何都要明确地执行

快速查看反射器中的代码可以看出这个

...
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
...

因此,当在Reader上调用dispose(true)时,底层流被关闭,然后当使用块退出时,所有对象都准备好进行垃圾收集。

using语句足以释放资源,这就是IDisposable模式存在的原因:)

答案 1 :(得分:4)

它正像处理器一样处理。 StreamReader.Dispose()已经处理好文件流,FileStream.Dispose()会耸耸肩而不是抱怨。

如果有任何明显的问题,那么它是File.OpenRead()。您没有指定FileShare值,它将使用FileShare.Read。这很正常,但是当其他人打开文件进行写作时,这会失败。当其他人已经获得写入权时,您不能省略FileShare.Write。 SysInternals的Handle实用程序可以帮助诊断这样的问题。