2010-02-15 7 views
3

파일 스트림을 사용중인 경우 (디버깅 할 때마다 첫 번째 라인에 도달하여 사용 중임을 나타냄), 어떻게 강제로 릴리스 할 수 있습니까? 그것은이 코드를 명중 할 때마다, 내가 뭔가를 말하는 메시지를 받게하는 것은 그것을 사용하고 있습니다 :FileStream 사용 중

FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read); 
byte[] buffer = new byte[fileStream.Length]; 
...etc. 
fileStream.Close(); 
+0

사용중인 파일은 무엇입니까? – SLaks

답변

17

가 사용하는 방법을 배우게 using :

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read)) 
{ 
    ... 
} 

당신이 떠날 때 using 구조는 파일이 폐쇄됩니다 보장 예외가 발생하더라도 차단하십시오.

문제는 여기에 없지만 코드의 다른 부분에있을 수 있습니다. 모든 코드를 살펴보고 파일을 연 장소를 찾고 using 문 안에 넣지 마십시오.

4

는 단순히 파일의 내용을 읽을 수하고 너무 큰 아닌 경우도

File.ReadAllText(string path); 

또는

File.ReadAllBytes(string path); 

을 사용하는 것이 좋습니다.

0

using을 사용하는 것이 올바른 방법입니다.

fileshare.readwrite 옵션을 지정하여 파일을 잠그지 않고 파일을 열 수도 있습니다.

2

using 문을 사용하는 것이 좋습니다. 그러나 그것은 당신의 유일한 선택이 아닙니다. 구문 론적으로 "깨끗한"모양과 사용 편의성 때문에 개발자가 선호하는 경향이 있습니다.

중요한 것은 (무엇이 using에서 항상 보장되는지) 무엇이든지간에 FileStream.Close을 호출하고 있는지 확인하는 것입니다. 예외가 발생하면이 코드가 누락 될 수 있습니다. 따라서 적어도 전화를 finally 블록에 넣으십시오. 나 자신을 처리 오류를 쓰고 있어요 경우

개인적으로, 나는 try/using/catchtry/catch/finally을 선호합니다. 이 finally 인 것을 선호하는 또 다른 시나리오는 여러 개의 IDisposable 개체로 작업하는 곳이며 깊은 중첩을 피하기를 원합니다. 다음 코드를 고려하십시오

try { 
    using (DisposableObject obj1 = GetDisposableObject()) { 
     // do something 

     using (DisposableObject obj2 = GetAnotherDisposableObject()) { 
      // do something else 

      using (DisposableObject obj3 = GetYetAnotherDisposableObject()) { 
       // do even more things 

       // this code is now quite nested 
      } 
     } 
    } 

} catch (SomeException ex) { 
    // some error-handling magic 
} 

지금이 해당 비교 : 개인적으로

DisposableObject obj1 = null; 
DisposableObject obj2 = null; 
DisposableObject obj3 = null; 

try { 
    obj1 = GetDisposableObject(); 
    // do something 

    obj2 = GetAnotherDisposableObject(); 
    // do something else 

    obj3 = GetYetAnotherDisposableObject(); 
    // do even more things 

    // this code doesn't have to be nested 

} catch (SomeException ex) { 
    // some error-handling magic 

} finally { 
    if (obj3 != null) obj3.Dispose(); 
    if (obj2 != null) obj2.Dispose(); 
    if (obj1 != null) obj1.Dispose(); 
} 

을, 나는 후자가 훨씬 더 읽을 수 찾을 수 있습니다.

분명히 개인적인 취향입니다. 위의 두 코드 샘플은 동일한 결과를 얻습니다.

+0

하지만 사용하는 경우 예외가 발생하더라도 닫을 것이라고 보장합니다. – PositiveGuy

+0

@coffeeaddict : 예 -'finally' 블록에 넣는 것과 같습니다 ('finally' 내부에있는 것이 무엇이든간에'try'의 어딘가에서 오류가 발생하더라도 실행됨을 보장합니다).내가 오류를 직접 처리하지 않는다면 일반적으로'using'을 사용합니다; (catch를 사용하여) 예외를 잡아 내고 싶다면'try '/'catch' /'catch'보다는'try /'catch' /'finally'를 사용하는 것이 더 깔끔합니다. 후자는 추가적인 레벨의 중첩 (순전히 개인적 취향)을 포함합니다. –