2017-09-04 14 views
2

私は、簡単なASP.NET WebApiアプリケーションを開発しています。ファイルが存在しないときusingライン上FileNotFoundException例外をスローFileMode.OpenOrCreateを使用すると、なぜFileNotFoundExceptionが発生しますか?

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

(ファイルが存在する場合、それは正常に動作します):コントローラで、私は次のコードを実行し、POSTアクションを持っています。

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

すべてが正常に動作し、私は関係なく、それが存在していたかどうか、ファイルに書き込むことができます。次のように私はそれを書き換える

OpenOrCreateは、1回のコールで2番目のスニペットの両方のケースをカバーする目的ではありませんか。

+1

isoStore.OpenFile()の実装を表示できますか? –

+0

@PawelMagaこれは 'System.IO.IsolatedStorage'名前空間の標準クラスのメソッドです。私はこれを明確にするために欠けているコードを追加しました。 – BartoszKP

+3

なぜビットマスクではないFileMode Enumでビット単位のORを使用していますか? FileMode.OpenOrCreate(4 = 100)| FileMode.Truncate(5 = 101)= 5(101)は、基本的に単なる切り詰めであり、既存のファイルが必要です。 – Shiffty

答えて

5

FileMode enumはフラグ型のenumではありません。つまり、ビット単位の演算を実行しないでください。 FileMode.OpenOrCreate | FileMode.Truncateはファイルが存在すると予想するFileMode.Truncateに解決されます。一般OpenOrCreateTruncate

は、ファイルを開くの2つの異なるモードですので、あなたは1(Createあなたが@Damien_The_Unbelieverに、クレジット必要なもののための合理的な選択肢であること)を選んだする必要があります。

+1

['Create'](https://msdn.microsoft.com/en-us/library/system.io.filemode(v = vs.110).aspx)は、彼らが望むものです: "** FileMode.Create **は、ファイルが存在しない場合はCreateNewを使用し、それ以外の場合は切り捨て" –

関連する問題