2010-01-15 2 views
3

Файл в следующей функции по-прежнему используется после инструкции using. Как я могу это исправить, чтобы освободить файл ....Файл C#, который все еще используется после оператора using

/// <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); 
     } 
    } 

ответ

12

Вы только имеете XmlWriter как объект в использовании, просто потому, что вы называете File.Create из кода, который находится внутри, используя не означает, что он будет утилизирован.

Использование двух блоков с использованием:

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

Спасибо, работал как шарм! –

+2

На самом деле это ошибка в реализации конкретного класса XmlWriter. Они забыли реализовать метод Dispose(). Использование Close() явно является другим методом обхода. –

+0

@nobugz: Это неправильное представление. Класс XmlWriter реализует интерфейс IDisposable и, таким образом, имеет метод Dispose. Он реализован явно, поэтому вам нужно использовать ссылку IDisposable для доступа к методу Dispose. Использование 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

Кроме того, дополнительные "с помощью" вариант заявление, которое было упомянуто, есть также свойство XmlWriterSettings.CloseOutput. Я считаю, что если вы установите это значение true, оно будет делать то, что вы хотите.

+0

Интересное имущество. Я до сих пор не слышал об этом. Спасибо, Дэниэл. http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.closeoutput%28loband%29.aspx –