2010-01-14 34 views
2

我有以下方法(下面),你可以看到它將一個對象序列化爲一個XML文件。我遇到的主要問題是我想讓函數覆蓋文件(如果存在)。 我知道我可以先刪除文件,如果它確實存在,但這也意味着我可能會導致一些錯誤拖入我的應用程序。所以我希望它是一個全部或沒有,覆蓋的方法...C#序列化到文件,覆蓋,如果存在

這是關於如何完成這一功能的任何想法?

/// <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(fileName,settings)) 
     { 

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

      } 
      serializer.Serialize(w, obj, ns); 
     } 
    } 

回答

14

,需要使用帶有字符串的Stream代替XmlWriter.Create的重載版本,並使用File.Create創建/覆蓋文件:

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

我認爲它會工作 - 真棒!和ty – 2010-01-14 13:31:16

0

備份目標文件(如果存在),如果發生錯誤,寫回文件。

+1

+1這是一個選項。 – 2010-01-14 13:27:58

4
  1. 打開使用File.Open(文件)用的FileMode .Create,FileAccess.Write和FileShare.None。
  2. 將從File.Open()返回的流傳遞給XmlWriter.Create()。

-

FileStream stream = File.Open(filename, FileMode.Create, FileAccess.Write, FileShare.None); 
using (XmlWriter writer = XmlWriter.Create(stream)) 
{ 
    ... 
} 
0

您可以保存新的XML文件在臨時文件:

./directory/myNewObject.xml.temp

然後重命名myNewObject.xml.temp在myNewObject.xml中使用File.MoveTo

0

你可以做下面的事情。將你的xml寫入一個StringBuilder(),並將stringBuilder的內容寫入文件。

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" }; 

     StringBuilder sb = new StringBuilder(); 
     using (var w = XmlWriter.Create(sb, settings)) { 

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

      } 
      serializer.Serialize(w, obj, ns); 
     } 

     File.WriteAllText(fileName, sb.ToString()); 
    } 
2

通過FileStream和XMLWriter就應該被放置在一個用塊

using (FileStream fs = File.Create(filename)) 
using (var w = XmlWriter.Create(fs, settings)) 
{ 
    // your code 
} 

我相信,用下面的代碼將無法釋放文件流。因此,如果您在一個會話中運行代碼兩次,它將失敗

using (var w = XmlWriter.Create(File.Create(filename), settings)) 
+0

你是對的。下半部分實際上未能釋放流。 – Ello 2015-08-12 07:26:24