2013-02-19 9 views
5

함수라는 Page_Load에서 다음 코드가 있습니다. Visual Studio를 시작한 후 처음으로 페이지를로드하면 모든 것이 정상적으로 작동합니다.
그러나 그 이후 파일에 다른 오프닝 호출은 직접으로 VisualStudio 솔루션의 파일을 열어이 오류FileStream.close()가 다른 프로세스에서 파일을 비우지 않습니다.

FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open); 
PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream); 
//Do some stuff with the file 
mailinglist_FileStream.Close(); 
mailinglist_Reader.Close(); 
mailinglist_Reader.Dispose(); 
mailinglist_FileStream.Dispose(); 

왜 파일이 ​​여전히 잠겨 (물론하지 예외)를 반환하는 경우에도, IOException: "File is in use by another process" 반환? 왜 Visual Studio를 완전히 다시 시작하면 파일이 다시 설정됩니까? 는 파일 속성을 검사 할 때 그것은 말한다 :

빌드 작업 : 콘텐츠
복사 출력 디렉토리 : 나는 단지이 파일을 읽고있다

복사하지 마십시오. 여러 프로세스가 파일에 액세스 할 수 있도록 adLockOptimistic과 비슷한 것을 할 수 있습니까?

+2

사이드 노트에 : 수동으로 닫고 처분하는 대신에 using 문을 사용하십시오 –

답변

7

파일이 잠겨있는 이유는 무엇입니까? 그리고 왜 Visual을 완전히 다시 시작합니까? Studio가 파일을 재설정합니까? 파일 등록 정보를 확인할 때 [...] 파일이 여전히 잠겨있는 이유를 모르겠습니다. 아마도 스트림이 닫히거나 처리되기 전에 코드가 실패하기 때문일 수 있습니다.

소개 "왜 완전히 다시 시작 비주얼 스튜디오 [...]" : 당신은 IIS Express 또는 그 당신이 IDE를 닫을 때 파일에 대한 잠금이 해제되도록, 폐쇄 ASP.NET 데브 서버를 사용할 수 있기 때문에 잠금을 유지하는 프로세스가 더 이상 실행되지 않기 때문입니다.

"파일이 잠긴 이유는 무엇입니까 [...]"스레드가 성공적으로 종료되지 않고 잠금이 해제되지 않을 수 있기 때문에 파일 스트림이 닫히지 않았기 때문일 수 있습니다. 다른 대답이 말했듯이

using 블록 IDisposable 오브젝트가 배치되지 않을 것을 피할 수있는 방법을 확인 : 만이 파일을 읽고있다

// FileShare.ReadWrite will allow other processes 
// to read and write the target file even if other processes 
// are working with the same file 
using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite)) 
using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream)) 
{ 
     // Do your stuff. Using blocks will call Dispose() for 
     // you even if something goes wrong, as it's equal to a try/finally! 
     // Also check how using statements can be chained without extra { }   
} 

. 여러 프로세스가 파일에 액세스 할 수 있도록 adLockOptimistic과 유사한 기능을 수행 할 수 있습니까?

것은 예, File.Open 방법 FileShare 열거에서 살펴 http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx
+1

FileShare 열거 형에 +1 – jessehouwing

+0

@Matias 중괄호에 관한 설명 : "without extra {}"는 언어 구문을 사용하는 개인적인 취향입니다. 단일 명령문 블록은 중괄호를 포함 할 필요가 없습니다. FileShare.ReadWrite는 다른 프로세스가 해당 파일에 액세스 할 수있게하지만 열려있는 파일의 문제는 해결하지 못합니다. 좋은 예와 좋은 점. – Suncat2000

0

using 블록을 사용해보십시오. 잠금 문제는 해결되지 않지만 일회용 개체의 경우 더 나은 형태입니다.

또한
using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open)) 
{ 
    using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream)) 
    { 
     ...    
    } 
} 

, mailinglist_FileStream 전에 mailinglist_Reader을 폐쇄하려고합니다.

+0

재미있는 점은 순서를 변경 한 후에 Page_Load가 작동하지만 catch (IOException) 블럭이 계속 실행 됨 – Vogel612

+1

'Stream.Close '블록 사용시 중복됩니다. –

+0

같은 예외는 무엇입니까? 두개의'Close();'행은'using'에 의해 아마도 호출되기 때문에 주석 처리를 해보십시오. –

1

학습 사용하는 using :

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

using 구조를 사용하면 예외가 throw 되더라도 블록을 나갈 때 파일이 닫힙니다.

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