C# using语句后文件仍在使用中

3
以下函数中的文件在使用语句后仍在使用中。 我该如何修复此问题以释放文件...
/// <summary>
    /// Serializes an object to an xml file.
    /// </summary>
    /// <param name="obj">
    /// The object to serialize.
    /// </param>
    /// <param name="type">
    /// The class type of the object being passed.
    /// </param>
    /// <param name="fileName">
    /// The filename where the object should be saved to.
    /// </param>
    /// <param name="xsltPath">
    /// Pass a null if not required.
    /// </param>
    public static void SerializeToXmlFile(object obj, Type type, string fileName, string xsltPath )
    {
        var ns = new XmlSerializerNamespaces();
        ns.Add(String.Empty, String.Empty);
        var serializer = new XmlSerializer(type);

        var settings = new XmlWriterSettings {Indent = true, IndentChars = "\t"};


        using (var w = XmlWriter.Create(File.Create(fileName), settings))
        {

            if (!String.IsNullOrEmpty(xsltPath))
            {
                w.WriteProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"" + xsltPath + "\"");

            }
            serializer.Serialize(w, obj, ns);
        }
    }
3个回答

12

在 using 块中,您只有 XmlWriter 作为对象。仅仅因为您在 using 内部的代码中调用了 File.Create,并不意味着它会被处理。

请使用两个 using 块:

using (FileStream f = File.Create(fileName)) {
   using (XmlWriter w = XmlWriter.Create(f, settings)) {
      ...
   }
}

2
这实际上是具体的XmlWriter类实现中的一个错误。他们忘记实现Dispose()方法。显式使用Close()是另一种解决方法。 - Hans Passant
@nobugz:这是一个误解。XmlWriter类实现了IDisposable接口,因此具有Dispose方法。它是显式实现的,因此您必须使用IDisposable引用来访问Dispose方法。在using块中使用XmlWriter将正确地处理其释放,并且Dispose方法调用Close方法。 - Guffa

3

关于什么:

using (var file = File.Create("fileName"))
{
    using (var w = XmlWriter.Create(file, settings))
    {
        if (!String.IsNullOrEmpty(xsltPath))
        {
            w.WriteProcessingInstruction(
                "xml-stylesheet", "type=\"text/xsl\" href=\"" + xsltPath + "\"");
        }
        serializer.Serialize(w, obj, ns);
    }
}

1
除了已经提到的额外"using"语句选项,还有XmlWriterSettings.CloseOutput属性。如果将其设为true,我相信它会做你想要的事情。

有趣的属性。直到现在我都从未听说过。谢谢Daniel。http://msdn.microsoft.com/zh-cn/library/system.xml.xmlwritersettings.closeoutput%28loband%29.aspx - Kris Krause

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接