2016-04-22 5 views
4

J'écris une application Windows Phone Silverlight. Je veux enregistrer un objet dans un fichier JSON. J'ai écrit le morceau de code suivant.C# - Enregistrer l'objet dans le fichier 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); 

Cela suffit pour créer un fichier JSON mais il est vide. Est-ce que je fais quelque chose de mal? N'était-ce pas supposé écrire l'objet dans le fichier?

+3

Avez-vous [fermer] (https://msdn.microsoft.com/fr-fr/library/system.io.streamwriter.close (v = vs.110) .aspx) le 'StreamWriter'? Ou mieux encore envelopper dans un 'using (var str = nouveau StreamWriter (isoStream)) {str.Write (jsonFile); } 'déclaration? Voir [Comment utiliser correctement la classe StreamWriter?] (Https://stackoverflow.com/questions/11467240/how-to-use-streamwriter-class-properly). – dbc

+0

Non, je ne l'ai pas fermé. – tony

+0

Eh bien c'est le problème alors. Si vous ne fermez pas le 'StreamWriter' certains contenus que vous avez écrits peuvent ne pas être vidés sur le disque. – dbc

Répondre

1

Le problème est que vous ne fermez pas le flux. Les E/S de fichiers dans Windows ont des tampons au niveau du système d'exploitation et .NET peut même implémenter des tampons au niveau de l'API, ce qui signifie qu'à moins que vous ne disiez à la classe "Maintenant que j'ai terminé", elle ne saura jamais quand s'assurer que ces tampons se propagent jusqu'au plateau.

Vous devez réécrire votre code légèrement, comme celui-ci:

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

using (...) { ... } veillera à ce que lorsque le code quitte le bloc, la partie { ... }, il appellera IDisposable.Dispose sur l'objet, qui dans ce cas sera vider les tampons et fermer le fichier sous-jacent.

0

Je les utilise. Shoud travaille pour vous aussi.

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; 
    }