我有一种方法可以删除早于10秒的同步时间,然后在触发时添加新的同步时间:
public void addSyncTime()
{
//delete archived sync times
XMLDocObject.Descendants("LastSync")
.Where(e => Convert.ToDateTime(e.Element("Time").Value) < DateTime.Now.AddSeconds(-10))
.Where(e => e.Element("id").Value != "1")
.Remove();
string t1 = XMLDocObject.ToString();
//get the last primary key added
var lastPrimaryKey = (from i in XMLDocObject.Element("DataLoadTimes").Elements("LastSync").Elements("id")
select i).LastOrDefault().Value;
//increment it once
int newPrimaryKey = Convert.ToInt32(lastPrimaryKey) + 1;
//create element to insert
var newElement = new XElement("LastSync",
new XElement("id", newPrimaryKey),
new XElement("Time", DateTime.Now.ToString()));
//add to XML doc object
XMLDocObject.Element("DataLoadTimes").Add(newElement);
string t2 = XMLDocObject.ToString();
}
以上字符串用于断点测试。
上面的代码创建了这样的XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<DataLoadTimes>
<LastSync>
<id>1</id>
<Time>4/1/2015 10:29:13 AM</Time>
</LastSync>
<LastSync>
<id>2</id>
<Time>4/1/2015 10:29:14 AM</Time>
</LastSync>
<LastSync>
<id>3</id>
<Time>4/1/2015 10:29:15 AM</Time>
</LastSync>
</DataLoadTimes>
以上是在触发上述内容后保存到XML的保存方法:
public async void saveToXmlFile()
{
//storageFile = await storageFolder.GetFileAsync(Settings.xmlFile);
using (Stream fileStream = await storageFile.OpenStreamForWriteAsync())
{
XMLDocObject.Save(fileStream);
}
}
现在,当使用第一种方法几次并保存时,我收到一个损坏的XML文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<DataLoadTimes>
<LastSync>
<id>1</id>
<Time>4/1/2015 10:23:53 AM</Time>
</LastSync>
<LastSync>
<id>2</id>
<Time>4/1/2015 10:27:04 AM</Time>
</LastSync>
</DataLoadTimes> <id>3</id>
<Time>4/1/2015 10:26:43 AM</Time>
</LastSync>
<LastSync>
<id>4</id>
<Time>4/1/2015 10:26:44 AM</Time>
</LastSync>
</DataLoadTimes>
请注意以下一行:</DataLoadTimes> <id>3</id>
那么这里发生了什么?调试显示试图保存的字符串存储在XDocucument对象中是正确的:
"<!--QTabs Data Storage-->\r\n<DataLoadTimes>\r\n <LastSync>\r\n <id>1</id>\r\n <Time>4/1/2015 10:23:53 AM</Time>\r\n </LastSync>\r\n <LastSync>\r\n <id>2</id>\r\n <Time>4/1/2015 10:27:04 AM</Time>\r\n </LastSync>\r\n</DataLoadTimes>"
为什么文件搞砸了?
答案 0 :(得分:3)
我对WinRT不是很熟悉,但是从我认为您需要使用的文档开始:
await storageFolder.CreateFileAsync("myxmlfile.xml", CreationCollisionOption.ReplaceExisting);
GetFileAsync
将按原样打开现有文件 - 这将允许您阅读其内容。由于您所写的内容小于现有内容,因此不会触及剩余的现有内容。
如果你想坚持使用GetFileAsync
,那么在写作之前设置fileStream.Length = 0
就可以解决你所看到的问题。