2013-02-16 2 views
2
public static async Task SaveFileAsync(string FileName, T data) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 
     serializer.WriteObject(memStream, data); 

     StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName, 
      CreationCollisionOption.ReplaceExisting); 
     using (Stream stream = await file.OpenStreamForWriteAsync()) 
     { 
      memStream.Seek(0, SeekOrigin.Begin); 
      await memStream.CopyToAsync(stream); 
      await stream.FlushAsync(); 
     } 
    } 

    public static async Task<T> RestoreFileAsync(string FileName) 
    { 
     T result = default(T); 
     try 
     { 
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(FileName); 
      using (IInputStream inStream = await file.OpenSequentialReadAsync()) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 
       result = (T)serializer.ReadObject(inStream.AsStreamForRead()); 
       return result; 
      } 
     } 

     catch (FileNotFoundException) 
     { 
      return default(T); 
     } 
    } 

Я использую этот код для сохранения и получения моих данных, и он отлично работает.локальное хранилище файлов удаляет контент автоматически

После сохранения моих данных в этом локальном файле и запуска моего приложения иногда нет данных.

Я сохраняю свои данные как файл .xml.

Я проверяю файл каждый раз, когда я сохраняю и у него есть сохраненный контент. Но иногда он удаляет его, я не знаю, почему.

Я пробовал DataContractJsonSerializer и все еще имею ту же проблему.

+0

Является ли файл пустым или удаленным? ** Когда ** это происходит? Можете ли вы запустить приложение во время просмотра файла? – Jess

+0

Нет, файл пуст, это происходит, когда я восстанавливаю данные, которые он удаляет, а не все время, только иногда, и иногда он хранит данные, которые я сохранил. –

+1

Это часто проблема блокировки. Помогает ли эта статья? http://blog.jerrynixon.com/2013/02/walkthrough-locking-asynchronous-file.html –

ответ

0

Как указал Джерри, это может быть проблемой блокировки. Это также может быть условие гонки (мы не видим код, в котором вы называете эти методы, поэтому убедитесь, что вызов нельзя вызвать, а другой уже запущен).

Один из потенциальных областей, я вижу, эти две линии:

storageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName, 
     CreationCollisionOption.ReplaceExisting); 
    using (Stream stream = await file.OpenStreamForWriteAsync()) 

В этом коде вы заботитесь создавшего файл в одном шаге (перезапись при необходимости), а затем открыть файл на другой стадии. Вы ожидаете, поэтому я не вижу здесь ничего плохого, но имеет смысл, что если вы закончите с пустым файлом, это может быть провал между этими двумя строками. Оказывается, существует перегрузка OpenStreamForWriteAsync, которая позволяет вам создать файл, если он не существует или перезаписать его, если это произойдет. Вы можете свернуть эти два шага в один.

http://msdn.microsoft.com/en-us/library/hh582148.aspx

Наконец (и я не думаю, что это не имеет ничего общего с вашей проблемой) вы можете пропустить поток памяти целиком. DataContractSerializer может писать прямо в FileStream просто отлично. Можете также сохранить себе несколько строк кода и объем памяти.

Я надеюсь, что это поможет. Сообщите нам, если вы это выясните.

поддержка Dev, поддержка дизайн и более удивительным добра на пути: http://bit.ly/winappsupport

0

Я была такая же проблема в моем проекте. Я добавил дождаться ключевого слова перед моими вызовами SaveFileAsync. Я больше не называю этот метод в обработчике OnSuspending App.xaml.cs, и теперь он работает.

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