2013-02-16 3 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

Jerry가 지적했듯이, 이것은 잠금 문제 일 수 있습니다. 또한 경쟁 조건이 될 수도 있습니다 (이 메소드를 호출하는 코드는 보이지 않으므로 다른 메소드가 이미 실행 중일 때 코드를 호출 할 수 없습니다). (필요한 경우 덮어 쓰기) 다음 다른 단계에서 파일을 여는 당신이 한 번에 파일을 생성하는 신경이 코드에서

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

: 내가 볼

하나 개의 잠재적 인 영역이 두 줄입니다. 당신은 기다리고 있습니다. 그래서 나는 여기서 아무 것도 볼 수 없지만, 빈 파일로 끝나면 두 줄 사이의 실패 일 수 있습니다. OpenStreamForWriteAsync의 과부하가있는 것으로 밝혀졌습니다. OpenStreamForWriteAsync가 없으면 파일을 만들거나 존재하지 않으면 덮어 씁니다. 이 두 단계를 하나로 축소 할 수 있습니다.

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

마지막으로 당신이 완전히 메모리 스트림을 건너 뛸 수 있습니다 (그리고 나는이 문제와 아무 상관이 있다고 생각하지 않습니다). DataContractSerializer는 FileStream에 직접 쓸 수 있습니다. 몇 줄의 코드와 메모리 사용량을 줄일 수 있습니다.

도움이 되었기를 바랍니다. 알아 내면 알려주세요. 가는 길에

데브 지원, 설계 지원 및 더 멋진 선량 :

0

http://bit.ly/winappsupport 나는 내 프로젝트에 동일한 문제가 있었다. SaveFileAsync를 호출하기 전에 이라는 키워드를 추가했습니다. App.xaml.cs의 OnSuspending 처리기에서이 메서드를 더 이상 호출하지 않으며 이제 작동합니다.

관련 문제