2015-04-01 24 views
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>" 

爲什麼文件中獲取搞砸?

+2

您保存的文件在寫入之前未被截斷,因此您只是覆蓋第一部分,剩下的就是之前的內容。你需要向我們展示'storageFile.OpenStreamForWriteAsync()'實際上做了什麼。 – 2015-04-01 15:36:34

+0

@Charles Mager如何截斷文件? storageFile來自Windows.Storage;這是我如何初始化:StorageFile storageFile = await storageFolder.GetFileAsync(「myxmlfile.xml」); – 2015-04-01 15:39:48

回答

3

我不是太熟悉的WinRT,但我覺得文檔,你需要使用:

await storageFolder.CreateFileAsync("myxmlfile.xml", CreationCollisionOption.ReplaceExisting); 

GetFileAsync將打開現有的文件,是 - 這將讓你讀它的內容。由於您正在撰寫的內容比現有內容小,因此不會觸及剩餘的現有內容。

如果你想堅持GetFileAsync然後在寫之前設置fileStream.Length = 0應該解決你看到的問題。