2012-03-18 4 views
32

서버 프로그램에서 쓰는 텍스트 파일을 모니터링하고 있습니다. 파일이 변경 될 때마다 콘텐츠가 내 프로그램의 창에 출력됩니다.다른 프로세스에서 사용하는 파일 읽기

used by another process이므로 파일에 Streamreader을 사용할 수 없다는 것이 문제입니다. FilestreamReadWrite으로 설정하면 파일을 사용하는 프로세스를 제어 할 수 없으므로 아무런 효과가 없습니다.

메모장에서 파일을 열 수 있습니다. 서버가 사용 중이더라도 액세스 할 수 있어야합니다.

좋은 방법이 있습니까?

다음을 수행해야합니까?

  1. 이 임시 복사본을 삭제 임시 사본
  2. 읽기가 변경 될 때 그것의 임시 복사본을 만듭니다 파일
  3. 를 모니터링합니다.

서버가 파일을 변경할 때마다 파일에서 텍스트를 가져와야합니다.

답변

67

메모장에서 파일을 읽을 수 있다면 프로그램에서 파일에 대한 읽기 잠금을 설정하지 않았 음을 분명히 알 수 있습니다. 실행중인 문제는 StreamReader가 FileShare.Read로 파일을 열 것입니다. 어느 쓰기 액세스를 거부합니다. 작동하지 않을 수도 있고, 다른 프로그램은 이미 쓰기 권한을 얻었습니다.

이 같은에서는 StreamReader를 만들어야합니다 :

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) { 
    // read the stream 
    //... 
} 

여기 인코딩에서 추측. 이런 종류의 코드는 신중해야하며 다른 프로그램은 파일에 적극적으로 쓰고 있습니다. 매우 신뢰할 수있는 파일 끝 표시를 얻지 못할 것이므로 부분 마지막 행을 얻는 것이 가능합니다. 특히 파일을 읽은 채로 프로그램을 추가하려고 시도 할 때 번거 롭습니다.

+2

고마워 ... 나는이 경우 FileShare.Read가 올바르지 않다는 것을 몰랐다. –

+2

'FileShare.ReadWrite | FileShare.Delete'를 사용하면 더 많은 수의 파일에 액세스 할 수 있습니다. 'FileShare.ReadWrite'가 충분하지 않을 때 시도 할 가치가 있습니다. – Adassko

+0

@Adassko 또는'FileShare.Read'가 충분하지 않은 경우 (이 경우와 같은 경우), 동일한 상황에서 필자가 동일한 종류의 코드에서 사용하고 있습니다. 그것을 작동 시키려면'FileShare.ReadWrite'로 전환해야했습니다. – vapcguy

10

다른 응용 프로그램이 독점적으로 파일을 고정하지 않은으로이만큼 작동합니다

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite) 

전화.

+0

고맙습니다. 그것은 streamreader와 함께 작동합니까? 이처럼 : File.Open (path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = 새 StreamReader (경로); – Christoffer

+0

@Tophe : 물론. IIRC에서 'StreamReader'매개 변수는 이러한 매개 변수를 직접 가져올 수도 있습니다. – SLaks

+0

그 모습은 어떨까요? Filereader에 매개 변수로 FileMode.Open, FileAccess.Read, FileShare.ReadWrite를 넣으면 작동하지 않습니다. 그것은 단지 약간의 인코딩 파라미터를 필요로한다고 말한다. – Christoffer

관련 문제