2017-09-04 170 views
2

我正在開發一個簡單的ASP.NET WebApi應用程序。在控制器我有一個POST操作,做了下面的代碼:爲什麼使用FileMode.OpenOrCreate時會出現FileNotFoundException?

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

其拋出的using線的時候文件不存在FileNotFoundException異常(正常工作時,該文件存在)。

當我把它改寫如下:

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

你能表現出isoStore.OpenFile的實現()? –

+0

@PawelMaga這是一個標準的類從'System.IO.IsolatedStorage'命名空間的方法。我已經添加了一段代碼來澄清這一點。 – BartoszKP

+3

爲什麼在FileMode枚舉上使用按位或不是一個位掩碼? FileMode.OpenOrCreate(4 = 100)| FileMode.Truncate(5 = 101)= 5(101)這基本上只是Truncate,它需要一個現有的文件。 – Shiffty

回答

5

FileMode枚舉不是一個標誌枚舉類型,這意味着你不應該在其上執行按位運算。 FileMode.OpenOrCreate | FileMode.Truncate解析爲FileMode.Truncate,它期望文件在那裏。

一般OpenOrCreateTruncate是打開文件的兩種不同的模式,所以你需要選擇一個(Create是你需要什麼,信貸@Damien_The_Unbeliever一個合理的選擇)。

+1

我認爲['Create'(https://msdn.microsoft.com/en-us/library/system.io.filemode(V = vs.110)的.aspx)是他們想要的東西:「** FileMode.Create **相當於請求如果該文件不存在,請使用CreateNew;否則,請使用截斷」 –

相關問題