C# StreamWriter、FileStream和windows文件锁

C# StreamWriter、FileStream和windows文件锁,c#,.net,file-io,locking,C#,.net,File Io,Locking,我正在编写一个小应用程序,使用.NET数据集和XML从数据库导出和导入数据,作为其中的一部分,我正在执行以下操作 StreamWriter sw = new StreamWriter(file); sw.Write(xml.OuterXml); sw.Close(); 问题是close方法关闭传递给构造函数的FileStream文件参数,但不释放文件锁。这个文件是我编写的程序创建的,所以我不知道还有什么东西在锁定它 是我做错了什么,还是这是一个windows错误 编辑 是的,“file”是一个

我正在编写一个小应用程序,使用.NET数据集和XML从数据库导出和导入数据,作为其中的一部分,我正在执行以下操作

StreamWriter sw = new StreamWriter(file);
sw.Write(xml.OuterXml);
sw.Close();
问题是close方法关闭传递给构造函数的FileStream文件参数,但不释放文件锁。这个文件是我编写的程序创建的,所以我不知道还有什么东西在锁定它

是我做错了什么,还是这是一个windows错误

编辑

是的,“file”是一个FileStream对象,我天真地认为,在封装文件流的流上调用close也会通过调用FileStream.close方法清理和处理底层文件流。但我对此再也不确定了

在using块中包装此项仍然具有相同的效果


需要特别注意的是,filestream对象是用不同的方法创建的,但这不会有任何区别

请尝试使用以下方法:

using (StreamWriter sw = new StreamWriter(file)) sw.Write(xml.OuterXml);
或者尝试手动调用sw.Dispose

将文件流包装成一个文件流是否有助于使用重载方法创建流编写器:

using (FileStream fs = new FileStream("path", FileMode.Append))
using (StreamWriter sw = new StreamWriter(fs))
{
    sw.Write(xml.OuterXml);
    sw.Close();
}
或:


我怀疑问题出在创建或使用文件流的代码中。也许您可以详细说明如何使用您创建的FileStream对象。

根据文档,Close调用Dispose。这似乎没有任何区别。当我再次尝试在.NET中打开文件时,文件仍然被锁定。是的,Close调用Dispose。问题是文件,OP没有关闭该文件,然后责怪操作系统是肛门保留和愚蠢的。@Jim如果StreamWriter不是通过处理它来关闭的,那么它将不可IDisposable,因为IDisposable的全部目的就是这样。Close调用的Dispose与其他方式相反,这是一个不相关的实现细节。@Ed:但是StreamWriter.Close调用在底层流上关闭。文件几乎肯定是一个FileStream,而FileStream.Close调用则是Dispose。因此,正在处理这些流。如何确定该文件仍处于锁定状态?我经常做这种事情,我从来没有遇到过你描述的问题。是的,什么是文件?它是文件流吗?如果是,你需要关闭它,这不是操作系统的错。和Jim一样,我对简单的IO操作没有问题。你可以控制肛门保留和愚蠢的文件锁定。如果您不想在打开文件时锁定它,请这样说:Windows的文件锁定没有问题。我敢打赌,在进程到达sw.Close之前,您抛出了一个异常;所以它被挂起来了。它最终会被发布。请考虑使用尽可能小的答案来避免这个问题在未来。正如所说的“文件”是一个FielestRAMM对象创建使用愚蠢的文件静态类OOP,它不是。为什么你调用SW?关闭内部使用?Dispose应该以任何方式关闭它。他可能只是从op复制/粘贴
using (StreamWriter sw = new StreamWriter("path"))
{
    sw.Write(xml.OuterXml);
    sw.Close();
}