2016-12-29 2 views
2

UWP 응용 프로그램에서 파일을 작성하고 쓰려고했습니다. 처음 실행해도 괜찮습니다. 두 번째로는 첫 번째 내용을 덮어 쓰고 파일에는 두 번째 실행 내용 만 덮어 씁니다. 새 노드에 관계없이 성능 저하를 추가 할 수있는 전에 전체 XML을 읽을 수 있어야하지만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

을 사용할 수 있습니다, 깨끗한 방법은 사용하는 것입니다

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

감사합니다. tao fyn을 작동합니다. – Visnu

+0

이것은 xml을 사용하는 좋은 방법이 아닙니다. 실적이 좋을 것입니다. 문제는 이미 존재하는 파일에 단순히 "추가"하고 싶다는 것입니다. 또한 여기에 코드를 복사하고 있습니다. 나는 상태에서 스트림을 새로 작성하거나 추가 한 다음 if/else 문 다음에 데이터를 작성합니다. – Thomas