2015-04-01 4 views
0

У меня есть метод, который удаляет синхронизации раза старше 10 сек старая и затем добавляет новый один при выстреле:LINQ к 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()'. –

+0

@Charles Mager Как обрезать файл? storageFile - из Windows. Хранилище; Вот как я инициализирую: StorageFile storageFile = ожидание storageFolder.GetFileAsync ("myxmlfile.xml"); –

ответ

3

Я не слишком хорошо знаком с WinRT, но из документации, я думаю, вам нужно использовать:

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

GetFileAsync откроет существующий файл как есть - это позволит вам прочитать его содержимое. Поскольку содержимое, которое вы пишете, меньше, чем существующее содержимое, оставшееся существующее содержимое не затрагивается.

Если вы хотите придерживаться GetFileAsync, тогда установка fileStream.Length = 0 перед тем, как писать, должна исправить проблему, которую вы видите.

Смежные вопросы