2017-09-04 7 views
2

Ich entwickle eine einfache ASP.NET WebApi-Anwendung. In einem Controller habe ich eine POST-Aktion, die den folgenden Code tut:Warum erhalte ich FileNotFoundException, wenn ich FileMode.OpenOrCreate verwende?

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

die die FileNotFoundException Ausnahme auf der using Linie wirft, wenn die Datei nicht existiert (es funktioniert gut, wenn die Datei vorhanden ist).

Wenn ich es wie folgt umschreiben:

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

alles funktioniert gut, und ich kann in die Datei schreiben, unabhängig davon, ob es existiert oder nicht.

Ist nicht der Zweck von OpenOrCreate beide Fälle aus dem zweiten Snippet in einem einzigen Anruf zu decken?

+1

Können Sie eine Implementierung von isoStore.OpenFile() anzeigen? –

+0

@PawelMaga Dies ist eine Methode einer Standardklasse aus dem Namensraum 'System.IO.IsolatedStorage'. Ich habe einen fehlenden Code hinzugefügt, um dies zu verdeutlichen. – BartoszKP

+3

Warum verwenden Sie bitweise OR auf der FileMode Enum, die keine Bitmaske ist? FileMode.OpenOrCreate (4 = 100) | FileMode.Truncate (5 = 101) = 5 (101) was im Grunde nur Truncate ist, was eine existierende Datei erfordert. – Shiffty

Antwort

5

FileMode enum ist keine Flag-Enumeration, was bedeutet, dass Sie keine bitweisen Operationen ausführen sollten. FileMode.OpenOrCreate | FileMode.Truncate wird in FileMode.Truncate aufgelöst, was erwartet, dass eine Datei vorhanden ist.

Im Allgemeinen OpenOrCreate und Truncate sind zwei verschiedene Modi Öffnen einer Datei, so müssen Sie ein wählen (Create für eine sinnvolle Alternative zu sein, was Sie brauchen, Kredit zu @Damien_The_Unbeliever).

+1

Ich denke, dass [Create] (https://msdn.microsoft.com/en-us/library/system.io.filemode (v = vs.110) .aspx) ist, was sie wollen : "** FileMode.Create ** entspricht der Anforderung, dass, wenn die Datei nicht existiert, CreateNew verwendet; andernfalls wird Truncate verwendet" –

Verwandte Themen