2008-11-10 9 views
0

공유 액세스 모드로 텍스트 파일을 읽는 중 다른 프로세스가 파일을 자르면 가장 쉬운 방법은 무엇입니까? (FileInfo 객체를 주기적으로 새로 고치는 것의 확실한 선택을 제외하고 있습니다.) 이벤트를 캡처하는 편리한 방법이 있습니까? (Filewatcher?)C에서 잘린 파일을 검색하는 방법

답변

3

FileSystemWatcher이라고합니다.

Windows Forms 응용 프로그램을 개발하는 경우 도구 상자에서 끌어다 놓을 수 있습니다. 당신이 프로젝트의 대부분의 유형에서 사용할 수 있어야하므로

private void myForm_Load(object sender, EventArgs e) 
{ 
    var fileWatcher = new System.IO.FileSystemWatcher(); 

    // Monitor changes to PNG files in C:\temp and subdirectories 
    fileWatcher.Path = @"C:\temp"; 
    fileWatcher.IncludeSubdirectories = true; 
    fileWatcher.Filter = @"*.png"; 

    // Attach event handlers to handle each file system events 
    fileWatcher.Changed += fileChanged; 
    fileWatcher.Created += fileCreated; 
    fileWatcher.Renamed += fileRenamed; 

    // Start monitoring! 
    fileWatcher.EnableRaisingEvents = true; 
} 

void fileRenamed(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file has been renamed! 
} 

void fileCreated(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file has been created! 
} 

void fileChanged(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file is modified! 
} 

그것은 System.IO 및 System.dll을에 있어요 :

여기에 일부 사용 예입니다.

+0

몰랐습니다. +1 –

+0

내 게시물에 나와 있듯이 나는 이것에 대해 생각했지만 다른 해결책이 있는지 궁금했다. 당신이 좋은 샘플 코드를 주었기 때문에 어쨌든 당신의 답변을 투표하고 있습니다! ;-) – dviljoen

+0

글쎄 .. 당신은 "편리한"방법을 요구하고있었습니다 ... 나는 더 편리한 것이 있다고 생각하지 않습니다. 아마도 @petercrabtree가 아래에서 말한 것처럼 문제에 대한 당신의 접근 방식을 재 설계하는 것 외에는 더 편리 할 것입니다. +1에 감사 드리며, 또 다른 능력을 얻는 것에 가까워지고 있습니다. :-) – chakrit

0

그냥 씹을만한 것; 귀하의 상황에 적용되지 않을 수도 있습니다 :

chakrit의 해결책은 당신이 요구 한 내용에 맞습니다.하지만 물어볼 필요가 있습니다. 왜 다른 프로세스가 파일을 읽는 동안 파일을 읽으려고합니까?

특히 동기화가없는 경우 파일을 동시에 읽고 쓰는 것이 특히 안전하지 않으며 다른 신비한 문제가있을 수 있습니다.

+0

필자는 기본적으로 창에 대한 꼬리 명령을 작성하고 있습니다. 필자는 키보드를 사용하는 사람들이 인터넷을 통해 전리품을 가지고있는 사람들에 의해 뇌졸중이 치닫고 있기 때문에 키보드에 꼬리 명령을 내리고 있습니다. 그것의 다른 구현의 이미 사용할 수 있습니다. – dviljoen

3

FSW가 안정적으로 작동하지 않을 수 있습니다. 비동기식입니다. 예외가 없다고 가정하면 StreamReader.ReadLine()은 파일이 잘 렸을 때 null을 반환합니다. 그런 다음 크기가 변경되었는지 확인하십시오. 어쩔 수없는 경쟁 조건에주의하십시오. 타이밍에 대한 가정을 확인해야합니다.

+0

예. 그러나 ReadLine()은 파일의 끝에있을 때 null을 반환합니다. 난 널 때마다 파일 크기를 확인할 수있을 것 같아. 나는 그것을 시도 할 것이라고 생각한다. 감사. BTW는 비동기가 신뢰할 수 없다는 것을 의미하지 않기 때문입니다. (아니면 당신이 의미하지 않은 것입니까?) – dviljoen

+0

비동기식이므로 FSW 알림을 받기 전에 EOF를받을 가능성이 훨씬 큽니다. 그것은 피할 수없는 피할 수없는 경쟁 조건입니다. –

관련 문제