为什么XMLWriter没有关闭?

时间:2011-03-05 18:40:53

标签: .net vb.net visual-studio-2010

我在关闭XMLWriter时遇到了一些麻烦。我可以成功编写一次XML文件,但如果我再次尝试写入(覆盖),我会得到异常:

 “进程无法访问文件'somefile.xml',因为它正由另一个进程使用。”

    Dim settings = New XmlWriterSettings()
    settings.Indent = True
    settings.IndentChars = " "
    settings.NewLineOnAttributes = True

    Try
    Dim writer As XmlWriter = XmlWriter.Create(System.IO.File.Create("somefile.xml"))
        writer.WriteStartDocument(True)
        writer.WriteStartElement("root")
        For rowCounter As Integer = ds.Tables(0).Rows.Count - 1 To 0 Step -1
            writer.WriteStartElement("someelement")
            writer.WriteElementString("col0", ds.Tables(0).Rows(rowCounter)(0).ToString)
            writer.WriteElementString("col1", ds.Tables(0).Rows(rowCounter)(1).ToString)
            writer.WriteElementString("col2", ds.Tables(0).Rows(rowCounter)(2).ToString)
            writer.WriteElementString("col3", ds.Tables(0).Rows(rowCounter)(3).ToString)
            writer.WriteElementString("col4", ds.Tables(0).Rows(rowCounter)(4).ToString)
            writer.WriteElementString("col5", ds.Tables(0).Rows(rowCounter)(5).ToString)
            writer.WriteElementString("col6", ds.Tables(0).Rows(rowCounter)(6).ToString)
            writer.WriteElementString("col7", ds.Tables(0).Rows(rowCounter)(7).ToString)
            writer.WriteEndElement()
        Next
        writer.WriteEndElement()
        writer.WriteEndDocument()
    Catch ex As System.IO.IOException
        MessageBox.Show(ex.Message)
    Finally
        writer.Flush()
        writer.Close()
    End Try

2 个答案:

答案 0 :(得分:15)

您缺少的是XmlWriterSettings。您声明它,但不使用它,并且当您未手动设置CloseOutput时,默认值为false,这意味着输出未关闭(在本例中为您的文件流)。

要让它按照您想要的方式运行,请更改您的代码:

Dim settings = New XmlWriterSettings()
settings.Indent = True
settings.IndentChars = " "
settings.NewLineOnAttributes = True
settings.CloseOutput = True             ' <<<< the change '

Using writer As XmlWriter = XmlWriter.Create(System.IO.File.Create("somefile.xml"), settings)
    '.... etc'
End Using

如果你想知道这在内部是如何工作的,这里是XmlEncodedRawTextWriterIndent的Close方法,你的场景中使用的内部XmlWriter。

// courtesy of Red Gate's Reflector
public override void Close()
{
    this.FlushBuffer();
    this.FlushEncoder();
    this.writeToNull = true;
    if (this.stream != null)
    {
        this.stream.Flush();
        if (this.closeOutput)      //this flag is set to settings.CloseOutput
        {
            this.stream.Close();
        }
        this.stream = null;
    }
    else if (this.writer != null)
    {
        this.writer.Flush();
        if (this.closeOutput)
        {
            this.writer.Close();
        }
        this.writer = null;
    }
}

答案 1 :(得分:2)

我希望期待这是文件而不是作者;如果这是C#,我会使用类似的东西:

using(var file = File.Create("somefile.xml"))
using(var writer = XmlWriter.Create(file))
{
    // write to the writer
}

using(我相信VB有同样的东西,可能Using)在这里节省了很多痛苦......