Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么XmlReader没有关闭FileStream_C#_.net_Idisposable_Xmlreader - Fatal编程技术网

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...
    }
}