2012-02-09 5 views
4

C# (.NET 웹 서비스)에서 파일을 만들고 기존 파일을 덮어 쓰지 않습니다.기존 파일에 대한 CreateNew를 사용하는 FileStream 생성자에 대해 C#에서 예외 발생

방법은 FileMode.CreateNew를 설정하여 FileStream을 구성하는 것으로 보입니다. 파일이 존재하면 실제로 예외를 throw합니다.

그러나 파일 작성으로 인해 발생할 수있는 다른 예외와는 달리이 예외를 어떻게 인식합니까? http://msdn.microsoft.com/en-us/library/47ek66wy.aspx에있는 문서는이 사건을 "IOException"으로 나열하고 있습니다.

여기에 대한 답은 IOException을 잡아낸 다음 File을 수행하는 것입니다 .Exists?

+1

예외에서 오류 코드를 사용할 수 있습니다. [System.IO.IOException에 대한 HResult를 결정하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/991537/how-do-i-determine-the-hresult-for-a-system-io- ioexception) 파일이 존재하면 0x80070050이됩니다. –

+0

@DmitryShkuropatsky : 아마도 그 대답을 – Guvante

답변

5

다음과 같이 예외에서 오류 코드를 얻을 수 있습니다 : 그것은 0x80070050 될 것 파일의 경우

int hr = Marshal.GetHRForException(ex); 

가 존재한다.

+0

나는 더 깨끗한 답변을 원했으나 현실은 이것과 비슷하다고 예상했다. 이것은 정확한 접근법과 내가 취할 것 같은 것 같습니다. 고마워, 드미트리. – dkeisen

0

다른 방법을 사용하는 것이 좋습니다. 먼저 File.Exist를 수행 한 다음 예외를 잡습니다. 그렇게하면 파일이 이미 있다는 사실에 의해 예외가 발생하지 않는다는 것을 확신 할 수 있습니다.

+3

으로 만들어야합니다. 그건 사실이 아닙니다. 기술적으로는 수표와 예외 처리 사이에 만들 수 있습니다 (드물지만 여전히 가능합니다). – colithium

+0

글쎄, 맞아. 기술적으로이 서비스는 InstanceContextMode.Single를 가질 수 있으며, 서비스 외부의 파일에 어떤 일이 발생했는지 말하지 않았습니다. – veblock

0

File.Exists 메서드가 가장 우아하다고 생각합니다. 근본 원인을 추측하고 추측하기 위해 반사 작용을 할 수 있지만 그만한 가치는 없습니다. InnerException이 더 뚜렷한 것으로 설정되었을 수도 있습니다. 그것은 null입니까?

그리고 Message 속성은 정확히 무엇이 일어 났는지 (영어 또는 사용중인 언어로) 설명해야합니다. Message가 반환 한 문자열에 의존하는 것도 좋은 생각이 아닙니다.

나는 당신의 아이디어를 가장 솔직하게 좋아합니다.

0

가장 좋은 방법은 FileStream을 만들기 전에 File.Exists을 사용하는 것입니다. 예 :

if (File.Exists(path)) 
{ 
    //Handle existing file 
} 
else 
{ 
    FileStream newFile = new FileStream(path, FileMode.CreateNew); 
    //Logic to do with your new file 
} 

는 '권리'IOException이이 취성 정확히 확인하기 위해 IOException가 구문 분석하려고합니다. IOException의 주석이나 설명을 비교하는 유일한 방법이라고 생각합니다.

+1

실망 스럽습니다. 나는 체크와 생성 사이에 창을 남기고 싶지 않았기 때문에 File.Exists 메서드를 사용하고 싶지 않았다. 취성이 정확히 왜 나는 질문 : 나는 메시지 필드를 확인하는 것이 옳은 대답이 될 수 없다는 것을 알고 있습니다. – dkeisen

+1

흠, 걱정됩니다. 나는 당신이 파일을 검사 할 때와 만들 때 사이에 아무런 격차도 없게하는 방법을 모른다. 그것은 부서지기 쉬울지도 모르지만, 나는 CreateNew에서 오는 예외 메시지가 변할 가능성이 있다고 믿지 않습니다. 만약 당신이 절대적으로 격차가 필요 없다면, 나는 단지 메시지를 비교할 것이지만 이것을 잘 문서화하도록하십시오. 정규 실행의 일부로 예외를 잡는 것은 권장되지 않습니다. 따라서 File.Exists 및 IOException 메시지를 확인하는 try-catch 수행하는 것이 좋습니다. 이렇게하면 99 %의 경우 File.Exists가 충분히 알려줄 것입니다. – Daryl