2017-09-04 3 views
2

간단한 ASP.NET WebApi 응용 프로그램을 개발 중입니다.FileMode.OpenOrCreate를 사용할 때 왜 FileNotFoundException이 발생합니까?

파일이 존재하지 않는 using 줄에 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

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은 플래그 유형 열거 형이 아니므로 비트 연산을 수행해서는 안됩니다. 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를 사용하고 그렇지 않으면자를 사용하는 것과 같습니다. –

관련 문제