C# 为什么XmlReader没有关闭FileStream
因此,我在C# 为什么XmlReader没有关闭FileStream,c#,.net,idisposable,xmlreader,C#,.net,Idisposable,Xmlreader,因此,我在XmlReader using (XmlReader reader = XmlReader.Create(new FileStream(archivePath, FileMode.Open), readerSettings)) { reader.close() } 然而,在使用作用域后,XmlReader的文件提要仍然处于锁定状态,奇怪的是,我认为XmlReader将为我关闭文件流,不是吗 谢谢你的帮助。你试过这个吗 using(var stream = new FileSt
XmlReader
using (XmlReader reader = XmlReader.Create(new FileStream(archivePath, FileMode.Open), readerSettings))
{
reader.close()
}
然而,在使用
作用域后,XmlReader
的文件提要仍然处于锁定状态,奇怪的是,我认为XmlReader
将为我关闭文件流
,不是吗
谢谢你的帮助。你试过这个吗
using(var stream = new FileStream(archivePath, FileMode.Open))
using(var reader = XmlReader.Create(stream, readerSettings))
{
}
我在文档中找不到任何明确说明XmlReader
在处理底层流时会调用dispose的内容。而且,我总是像上面所示那样使用它,我从来没有遇到过问题
浏览reflector时,我也没有发现它在创建XmlTextReaderImpl
时在流上调用Dispose()
的实例。XmlTextReaderImpl
未实现Dispose()
,其Close()
方法如下所示:
internal void Close(bool closeInput)
{
if (this.parsingFunction != ParsingFunction.ReaderClosed)
{
while (this.InEntity)
{
this.PopParsingState();
}
this.ps.Close(closeInput);
this.curNode = NodeData.None;
this.parsingFunction = ParsingFunction.ReaderClosed;
this.reportedEncoding = null;
this.reportedBaseUri = string.Empty;
this.readState = ReadState.Closed;
this.fullAttrCleanup = false;
this.ResetAttributes();
}
}
您需要跟踪
FileStream
和XmlReader
。XmlReader
关闭底层流有潜在危险。在多个读卡器使用FileStream
的情况下:如果其中一个读卡器关闭流,这将导致其他读卡器意外失败
这有点痛苦,因为一些流读者和作者会关闭底层流,而其他人则不会。作为最佳实践,我总是手动关闭和处理打开的流。这也有助于缓解某些流的一些“陷阱”。e、 g.您应该能够通过XmlReaderSettings.CloseInput来控制这一点
readerSettings.CloseInput = true;
using (XmlReader reader = XmlReader.Create(new FileStream(archivePath, FileMode.Open), readerSettings))
{
// do work with the reader
}
或者,如果您不关心其他读卡器设置,请更简洁地说:
using (XmlReader reader = XmlReader.Create(new FileStream(archivePath, FileMode.Open), new XmlReaderSettings() { CloseInput = true }))
{
// do work with the reader
}
虽然晚了几年,但也许这会对某人有所帮助 我尝试了Eric的方法,因为这似乎是一个很好的解决方案,但当我运行VS代码分析时,我不断收到警告 在的底部,Microsoft建议使用以下内容: (我稍微修改了“XmlReader”的it。) 而不是
using (Stream stream = new FileStream("file.txt", FileMode.Open))
{
using (XmlReader reader = new XmlReader (stream))
{
// Use the reader object...
}
}
它要长得多,但至少不会发出任何警告。老实说,不会。我认为XmlReader就像StreamReader一样,一旦完成,就会关闭内部流。use two using语句有点笨拙。这是一则轶事,但我看到的大多数示例都使用了two
using
。@TOMMYWANG:你可能这么认为,但我在代码(使用反射镜)中找不到XmlTextReaderImpl
(这就是XmlReader.Create()
实际返回的)处理流的任何地方。如果它确实关闭了流,那么在为多个读卡器使用一个流时,您会遇到问题(如果我想让流保持活动状态,怎么办?为什么读卡器会认为我不能?),因此它采取了不做任何事情的安全方法。我不同意这一点“笨拙”,但“笨拙”总比“破碎”好。@TOMMYWANG:NP,很高兴能帮上忙:)我宁愿底层流不被阅读器关闭,因为你以后可能仍然想使用该流,但不能,因为它本来会被关闭的!这是最好的行为。答案很好,如果设置CloseInput=false,FxCop就不会抱怨多个处理,这让我很恼火。这里的reader.close()语句不是多余的吗?因为退出using语句将调用Dispose(),而这将调用close()?
using (Stream stream = new FileStream("file.txt", FileMode.Open))
{
using (XmlReader reader = new XmlReader (stream))
{
// Use the reader object...
}
}