我正在使用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就是......所以我假设它在某处保留了一些锁......?
答案 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实用程序可以帮助诊断这样的问题。