2016-12-29 34 views
2

我試圖創建並寫入UWP application.On首先執行該文件,它工作正常,在第二次它覆蓋第一內容和該文件只有從第二個執行中的內容。UWP在寫現有文件

  Windows.Storage.StorageFolder Location = ApplicationData.Current.LocalFolder; 
    var lstfiles = await Location.GetFilesAsync(CommonFileQuery.OrderByName); 
     var foundfile = lstfiles.Where(x => x.Name==Test.dat").FirstOrDefault(); 

     if (foundfile==null) 
     { 
      StorageFile fil = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("Test.dat"); 
      //StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("Test.dat"); 
      using (IRandomAccessStream writeStream = await fil.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       System.IO.Stream s = writeStream.AsStreamForWrite(); 
       System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings(); 
       settings.Async = true; 
       using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(s, settings)) 
       { 

        writer.WriteStartElement("Order"); 
        writer.WriteElementString("OrderID", "y1"); 
        writer.WriteElementString("OrderTotal", "y2"); 
        writer.WriteElementString("Customer", "y3"); 
        writer.WriteElementString("Phone", "y4"); 
        writer.Flush(); 
        await writer.FlushAsync(); 
       } 
      } 
     } 
     else 
     { 
      StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("Test.dat"); 
      using (IRandomAccessStream writeStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       System.IO.Stream s = writeStream.AsStreamForWrite(); 
       System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings(); 
       settings.Async = true; 
       using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(s, settings)) 
       { 
        writer.WriteStartElement("Order"); 
        writer.WriteElementString("OrderID", "v51"); 
        writer.WriteElementString("OrderTotal", "v2"); 
        writer.WriteElementString("Customer", "v3"); 
        writer.WriteElementString("Phone", "v4"); 
        // await FileIO.AppendTextAsync(file, writer.ToString()); 
        writer.Flush(); 
        await writer.FlushAsync(); 
       } 
      } 
     } 

回答

1

雖然你必須能夠添加一個新的節點,無論是性能命中之前讀取整個XML,一個更簡潔的方法是使用

StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("Test.dat", CreationCollisionOption.OpenIfExists); 
var info = await file.GetBasicPropertiesAsync(); 
XDocument xDocument = null; 
if(info.Size > 0) 
    /* read existing file here */ 
else 
    /* create an empty document here */ 
XElement root = xDocument.Element("Root"); 
IEnumerable<XElement> rows = root.Descendants("Order"); 
XElement firstRow = rows.First(); 
firstRow.AddBeforeSelf(
    new XElement("Order", 
    new XElement("OrderID", "y1"), 
    new XElement("OrderTotal", "y2"), 
    new XElement("Customer", "y3"), 
    new XElement("Phone", "y4"))); 
await FileIO.WriteTextAsync(file, xDocument.ToString()); 

這樣你就沒有代碼重複。

-1

您可以使用LINQ的Xml

Windows.Storage.StorageFolder Location = ApplicationData.Current.LocalFolder; 
var lstfiles = await Location.GetFilesAsync(CommonFileQuery.OrderByName); 
var foundfile = lstfiles.Where(x => x.Name == "Test.dat").FirstOrDefault(); 

if (foundfile == null) 
{ 
    StorageFile fil = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("Test.dat"); 
    XElement root = new XElement("Root"); 
    root.Add(
     new XElement("Order", 
     new XElement("OrderID", "y1"), 
     new XElement("OrderTotal", "y2"), 
     new XElement("Customer", "y3"), 
     new XElement("Phone", "y4"))); 
    await FileIO.WriteTextAsync(fil, root.ToString()); 

} 
else 
{ 
    StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("Test.dat"); 
    var doc = await FileIO.ReadTextAsync(file); 
    XDocument xDocument = XDocument.Parse(doc); 
    XElement root = xDocument.Element("Root"); 
    IEnumerable<XElement> rows = root.Descendants("Order"); 
    XElement firstRow = rows.First(); 
    firstRow.AddBeforeSelf(
     new XElement("Order", 
     new XElement("OrderID", "y1"), 
     new XElement("OrderTotal", "y2"), 
     new XElement("Customer", "y3"), 
     new XElement("Phone", "y4"))); 
    await FileIO.WriteTextAsync(file, xDocument.ToString()); 
} 
+0

感謝ü陶它的工作原理菲英島 – Visnu

+0

這是不使用XML進行一個很好的方法。你將會獲得一場表演。看來問題在於你真的只是想「追加」到已存在的文件。另外,請注意你在這裏複製代碼。我會得到一個處於狀態的流,以寫入新的或附加的數據,然後在if/else語句之後寫入數據。 – Thomas