2009-10-22 3 views
17

StreamReader는 텍스트 파일을 읽는 동안 잠급니다.
강제로 StreamReader를 "읽기 전용"모드 또는 "비 잠금"모드로 작동시킬 수 있습니까?StreamReader가 사용되는 동안 텍스트 파일을 잠그지 않도록 할 수 있습니까?

임시 해결책으로 파일을 복사하고 거기에서 읽을 수 있지만 가능한 경우 직접 StreamReader를 사용하는 것이 좋습니다. 다른 대안이 있습니까?

배경 :
로그 파일에서 일부 통계를 얻기 위해 작은 응용 프로그램을 작성했습니다. 이 파일은 외부 프로그램에 의해 끊임없이 업데이트되고 (수 초간) AAXXYY 호출이 가능합니다.

출력을 검토하면 내 앱이 파일을 잠그고 AAXXYY이 (가) 작성되지 않을 수 있음을 알 수 있습니다.

이 내가 당신을 위해 StreamReader로하여 FileStream을 통과하고 적절한 파일 공유 값으로하여 FileStream을 만들 수 있습니다

private void btnGetStats_Click(object sender, EventArgs e) 
    { 
     int countStarts = 0; 
     int countEnds = 0; 

     IList<string> sessions = new List<string>(); 

     using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode)) 
     { 
      while(!stRead.EndOfStream) 
      { 
       string line = stRead.ReadLine(); 
       if(line.Contains("Session start")) 
       { 
        countStarts++; 
        sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("["))); 
       } 
       if (line.Contains("Session end")) 
       { 
        countEnds++; 
        sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("["))); 
       } 
      } 
     } 

     txtStarts.Text = countStarts.ToString(); 
     txtEnds.Text = countEnds.ToString(); 
     txtDifference.Text = (countStarts - countEnds).ToString(); 

     listBox1.DataSource = sessions; 
    } 

답변

38

을하고 있어요 것입니다. 예를 들어 :

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var reader = new StreamReader (file, Encoding.Unicode)) { 
} 
+0

+1 이것은 잘 작동합니다. 고맙습니다. 나는 "var"를 FileStream & StreamReader로 대체해야했지만. var는 무엇을하도록지지 받습니까? VB인가? 이 답변을 변경해야 편집 할 수 있다고 생각하지만 담당자에게 직접 문의하십시오. –

+6

'var'키워드에 대한 내용은 다음 링크를 참조하십시오. http://msdn.microsoft.com/en-us/library/bb383973 .aspx. 이 키워드는 C# 3.0 이상에서 새로 추가되었습니다. – pyrocumulus

+0

아하. 고마워. 어두운 시대에서 일하기에 나에게 맞는 것입니다. 부끄러운 줄 알아서 +1을 쓸 수 없다 :-) –

6

생각 나는 몇 가지 컨텍스트를 추가 할 것,에서는 StreamReader 하지 만이 읽고있는 침묵을 작성하기위한 을 읽기 위해 파일을 고정한다. 아래의 코드를 StreamReader 클래스에서 살펴보십시오.

new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan); 

사항은 MSDN http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

걸리는 기본 FileAccess.Read 매개 변수는 읽기 파일의 이후 개방을 할 수 있습니다. 이 플래그를 지정하지 않으면 파일을 닫을 때까지 (이 프로세스 또는 다른 프로세스에 의한) 읽기 용으로 파일 열기 요청이 실패합니다. 그러나이 플래그를 지정해도 파일에 액세스하려면 추가 권한이 필요할 수 있습니다.

다시 MSDN에서 읽거나 쓰려면 FileAccess.ReadWrite를 사용하십시오 (Jb Evain에서 제안한대로).

읽기 또는 쓰기를 위해 파일을 여는 것을 허용합니다. 이 플래그를 지정하지 않으면 파일을 열어 읽기를 요청하거나 쓰기 (이 프로세스 또는 다른 프로세스에서)는 파일이 닫힐 때까지 실패합니다. 그러나이 플래그를 지정해도 파일에 액세스하려면 추가로 권한이 필요할 수 있습니다.

관련 문제