0
我有刪除的同步時間早於10秒的老方法,然後添加一個新的發射時:的LINQ to XML文件不保存正確
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);
}
}
現在,使用第1種方法幾次時和保存我收到損壞的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>"
爲什麼文件中獲取搞砸?
您保存的文件在寫入之前未被截斷,因此您只是覆蓋第一部分,剩下的就是之前的內容。你需要向我們展示'storageFile.OpenStreamForWriteAsync()'實際上做了什麼。 – 2015-04-01 15:36:34
@Charles Mager如何截斷文件? storageFile來自Windows.Storage;這是我如何初始化:StorageFile storageFile = await storageFolder.GetFileAsync(「myxmlfile.xml」); – 2015-04-01 15:39:48