2017-09-04 4 views
2

Je développe une application ASP.NET WebApi simple. Dans un contrôleur, j'ai une action POST qui fait le code suivant:Pourquoi est-ce que je reçois FileNotFoundException lors de l'utilisation de FileMode.OpenOrCreate?

using (var isoStore = IsolatedStorageFile.GetUserStoreForAssembly()) 
{ 
    using (var textWriter = new StreamWriter(
     isoStore.OpenFile(filename, FileMode.OpenOrCreate | FileMode.Truncate))) 
    { 
     // write to file 
    } 
} 

qui jette l'exception FileNotFoundException sur la ligne using lorsque le fichier n'existe pas (il fonctionne très bien lorsque le fichier existe).

Quand je le récrire comme suit:

using (var isoStore = IsolatedStorageFile.GetUserStoreForAssembly()) 
{ 
    StreamWriter textWriter; 
    if (!isoStore.FileExists(filename)) 
    { 
     textWriter = new StreamWriter(isoStore.CreateFile(filename)); 
    } 
    else 
    { 
     textWriter = new StreamWriter(
      isoStore.OpenFile(filename, FileMode.Open | FileMode.Truncate)); 
    } 
} 

tout fonctionne bien, et je peux écrire dans le fichier, peu importe si elle existe ou non.

Le but de OpenOrCreate n'est-il pas de couvrir les deux cas du deuxième extrait d'appel?

+1

Pourriez-vous montrer une implémentation de isoStore.OpenFile()? –

+0

@PawelMaga C'est une méthode d'une classe standard de l'espace de noms 'System.IO.IsolatedStorage'. J'ai ajouté un morceau de code manquant pour clarifier ceci. – BartoszKP

+3

Pourquoi utiliser OU bit à bit sur le FileMode Enum, qui n'est pas un masque de bits? FileMode.OpenOrCreate (4 = 100) | FileMode.Truncate (5 = 101) = 5 (101) qui est essentiellement juste Truncate, ce qui nécessite un fichier existant. – Shiffty

Répondre

5

FileMode enum n'est pas une énumération de type d'indicateur, ce qui signifie que vous ne devez pas effectuer d'opérations au niveau du bit. FileMode.OpenOrCreate | FileMode.Truncate résout à FileMode.Truncate qui s'attend à ce qu'un fichier soit là.

En général OpenOrCreate et Truncate sont deux modes différents de l'ouverture d'un fichier, vous devez donc choisir un (Create étant une alternative raisonnable pour ce que vous avez besoin, le crédit à @Damien_The_Unbeliever).

+1

Je pense que [ 'create'] (https://msdn.microsoft.com/en-us/library/system.io.filemode (v = vs.110) .aspx) est ce qu'ils veulent : "** FileMode.Create ** est équivalent à demander que si le fichier n'existe pas, utilisez CreateNew, sinon, utilisez Truncate" –