2012-12-04 10 views
6

다음 두 코드 블록을 사용하면 두통이 생깁니다.FileStream 읽기 및 쓰기 용 파일 잠금 C#

using 문에서 잠금을 제공하는 파일 스트림을 사용하고 있기 때문에 실제로 논리적으로 작동해야합니다. StreamWriter를 만드는 줄이되면 "파일에 쓸 수 없습니다."라는 메시지가 나타나지 않습니다.

내 프로그램이 다중 스레드 응용 프로그램입니다. 모든 스레드가이 파일에 쓰려고 시도 할 수 있습니다. 프로그램을 잠그고 내용을 읽고 내용을 확인한 다음 변경 내용을 다시 작성해야합니다. 이 프로세스 중에는 다른 스레드가 해당 파일에 액세스 할 수 없어야합니다.

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    var sr = new StreamReader(fs); 
    var str = sr.ReadToEnd(); 
    var strArray = str.Split(','); 
    if (strArray.Any(st => st == text)) 
    { 
     return; 
    } 
    sr.Close(); 

    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

답변

6

FileShare.None 플래그는 그냥 파일, 당신이 얻을 따라서 예외를 잠금, 스레드가 대기열 발생하지 않습니다. 상호 배타적 인 액세스를 제공하기 위해 쓰기 전에 공유 객체를 잠글 수 있습니다.

하지만 "지금 내 프로그램이 다중 스레드 응용 프로그램이므로 모든 스레드가이 파일에 쓰려고 할 수 있습니다."라고 말합니다. 이제,이 쓰레드는 모두 똑같은 방법을 사용하여 파일에 기록합니까?

lock (lockObject) 
{ 
    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

나는 몇 가지 가정에 대한을 만들었습니다 ...

private static object lockObject = new object(); 

여기에 그것을 사용 ...

정적 클래스 변수 만들기 ...의 그들은,이 일을해야 할 가정하자 따라서 스레드가 작동하지 않거나 우리에게 더 많은 정보를 제공한다면 동기화에 대한 정보를 찾아야 할 수도 있습니다.

또한 StreamReader를 이전에 닫으십시오 (이전에 메서드가 반환 될 경우를 대비하여). 사용 직후에 닫으십시오.