UWP 覆盖现有文件
UWP Over Write the existing File
我尝试在 UWP 中创建和写入文件 application.On 第一次执行它工作正常,第二次它覆盖第一个内容并且文件只有第二次执行的内容。
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();
}
}
}
您可以使用 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());
}
虽然您必须阅读整个 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());
这样你就没有代码重复了。
我尝试在 UWP 中创建和写入文件 application.On 第一次执行它工作正常,第二次它覆盖第一个内容并且文件只有第二次执行的内容。
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();
}
}
}
您可以使用 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());
}
虽然您必须阅读整个 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());
这样你就没有代码重复了。