2016-04-22 16 views
4

私はWindows Phone Silverlightアプリケーションを作成しています。オブジェクトをJSONファイルに保存したい私は次のコードを書いた。C# - オブジェクトをJSONファイルに保存

string jsonFile = JsonConvert.SerializeObject(usr); 
IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication(); 
IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("users.json", FileMode.Create, isoStore); 

StreamWriter str = new StreamWriter(isoStream); 
str.Write(jsonFile); 

これはJSONファイルを作成するのには十分ですが、空です。私は何か間違っているのですか?これはオブジェクトをファイルに書き込むはずですか?

+3

[閉じる](https://msdn.microsoft.com/en-us/library/system.io.streamwriter.close(v = vs.110).aspx) 'StreamWriter'を終了しましたか?それとも、それを 'using(var str = new StreamWriter(isoStream)){str.Write(jsonFile);}でラップしてください。 } 'ステートメント? [StreamWriterクラスを正しく使用するには?](https://stackoverflow.com/questions/11467240/how-to-use-streamwriter-class-properly)を参照してください。 – dbc

+0

いいえ、私はそれを閉じなかった。 – tony

+0

これは問題です。 'StreamWriter'を閉じなければ、書き込んだ内容の一部がディスクにフラッシュされないことがあります。 – dbc

答えて

1

問題はストリームを閉じていないことです。

WindowsのファイルI/Oにはオペレーティングシステムレベルのバッファがあり、.NETはAPIレベルでバッファを実装することさえあります。つまり、「今完了しました」というクラスを教えない限り、それらのバッファが確実にプラッタに至るまで伝播するようにします。

あなたはこのように、わずかにあなたのコードを書き直す必要があります。

using (StreamWriter str = new StreamWriter(isoStream)) 
{ 
    str.Write(jsonFile); 
} 

using (...) { ... }コードがブロック、{ ... }一部を離れるとき、それはこのケースであろう、オブジェクトのIDisposable.Disposeを呼び出すことを保証しますバッファをフラッシュし、基礎となるファイルを閉じます。

0

私はこれらを使用します。シャードはあなたのためにも働きます。

public async Task SaveFile(string fileName, string data) 
    { 
     System.IO.IsolatedStorage.IsolatedStorageFile local = 
      System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication(); 

     if (!local.DirectoryExists("MyDirectory")) 
      local.CreateDirectory("MyDirectory"); 

     using (var isoFileStream = 
       new System.IO.IsolatedStorage.IsolatedStorageFileStream(
        string.Format("MyDirectory\\{0}.txt", fileName), 
        System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite, 
         local)) 
     { 
      using (var isoFileWriter = new System.IO.StreamWriter(isoFileStream)) 
      { 
       await isoFileWriter.WriteAsync(data); 
      } 
     } 
    } 

    public async Task<string> LoadFile(string fileName) 
    { 
     string data; 

     System.IO.IsolatedStorage.IsolatedStorageFile local = 
      System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication(); 

     using (var isoFileStream = 
       new System.IO.IsolatedStorage.IsolatedStorageFileStream 
        (string.Format("MyDirectory\\{0}.txt", fileName), 
        System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read, 
        local)) 
     { 
      using (var isoFileReader = new System.IO.StreamReader(isoFileStream)) 
      { 
       data = await isoFileReader.ReadToEndAsync(); 
      } 
     } 

     return data; 
    } 
関連する問題