using语句后仍在使用的C#文件
using语句之后,以下函数中的文件仍在使用中。如何修复此问题以释放文件using语句后仍在使用的C#文件,c#,C#,using语句之后,以下函数中的文件仍在使用中。如何修复此问题以释放文件 /// <summary> /// Serializes an object to an xml file. /// </summary> /// <param name="obj"> /// The object to serialize. /// </param> /// <param name="type">
/// <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);
}
}
//
///将对象序列化为xml文件。
///
///
///要序列化的对象。
///
///
///正在传递的对象的类类型。
///
///
///对象应保存到的文件名。
///
///
///如果不需要,则传递null。
///
公共静态无效文件(对象对象对象、类型、字符串文件名、字符串xsltPath)
{
var ns=新的XmlSerializerNamespaces();
ns.Add(String.Empty,String.Empty);
var serializer=新的XmlSerializer(类型);
var settings=newxmlwritersettings{Indent=true,IndentChars=“\t”};
使用(var w=XmlWriter.Create(File.Create(文件名),设置))
{
如果(!String.IsNullOrEmpty(xsltPath))
{
w、 WriteProcessingInstruction(“xml样式表”,“类型=\”文本/xsl\”href=\“”+xsltPath+“\”);
}
serializer.Serialize(w,obj,ns);
}
}
在using中只有XmlWriter作为对象,这仅仅是因为您调用了文件。从using中的代码创建并不意味着它将被释放
使用两个使用块:
using (FileStream f = File.Create(fileName)) {
using (XmlWriter w = XmlWriter.Create(f, settings)) {
...
}
}
那么:
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);
}
}
除了前面提到的附加“using”语句选项外,还有XmlWriterSettings.CloseOutput属性。我相信,如果您将其设置为true,它将实现您想要的功能。有趣的属性。直到现在我才听说这件事。谢谢你,丹尼尔。这实际上是具体XmlWriter类实现中的一个bug。他们忘记实现Dispose()方法。显式使用Close()是另一种解决方法。@nobugz:这是一种误解。XmlWriter类实现IDisposable接口,因此具有Dispose方法。它是显式实现的,因此必须使用IDisposable引用来访问Dispose方法。在Using块中使用XmlWriter将正确地处理它,dispose方法调用Close方法。