2016-12-29 37 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