2012-09-14 3 views
-1

FileSystemWatcher 클래스를 사용하여 변경 내용을 디렉터리에서 모니터링하는 프로그램이 있습니다. 다른 클라이언트가 StreamWriter을 사용하여이 디렉토리에 쓰고 있습니다. "때때로", 파일 시스템 워처 생성 이벤트에서 파일에 액세스하려고하면 오류가 발생합니다.StreamWriter 및 FileSystemWatcher 함께 사용

자주 발생하지 않으므로 디버깅하기가 매우 어렵습니다. 클라이언트가 Using 블록에 동봉하여 스트림을 제대로 닫고 있습니다. "이 응용 프로그램은 다른 프로세스에서 사용중인 파일을 사용할 수 없습니다"라는 줄에 오류가 있습니다. 필자는 클라이언트가 동일한 코드를 사용하여 디렉토리에 파일을 쓸 때 왜 오류가 산발적으로 나타나는지 이해하지 못합니다. 때때로 대부분의 시간 동안 수동 복사가 오류를 throw합니다.

해당 디렉토리는 로컬 네트워크 디렉토리가 아닙니다. 제발 제안 해주세요. 응용 프로그램 이벤트 코드

public void Temp() 
{ 
FileSystemWatcher fs = new FileSystemWatcher(); 

fs.Path = GlobalStatics.PathWorkOrders; 
fs.IncludeSubdirectories = false; 
fs.Filter = "*.wo"; 
fs.EnableRaisingEvents = true; 

fs.Created += CreatedEvent; 
} 

public void CreatedEvent(object sender, System.IO.FileSystemEventArgs e) 
    { 
     string guidStr = Path.GetFileNameWithoutExtension(e.FullPath); 

     using (StreamReader sr = new StreamReader(e.FullPath)) 
     { 
      //Processing 
      sr.Close(); 
     } 
    } 
+2

코드를 표시 할 수 있습니다. 아마도 for 루프에서 수행 중이지만 코드를 보지 못한 채로 말할 수없는 경우 StreamWriter의 인스턴스를 만들어야합니다. – MethodMan

+0

코드가 있습니다. – swiftgp

+0

이것은입니다. 피할 수 없는. 잠시 기다렸다가 다시 시도하십시오. –

답변

3

모니터링

클라이언트 코드

using (StreamWriter ss = new StreamWriter(input)) { 
    ss.WriteLine(args(0)); 
    ss.Close(); 
} 

그것은 코드없이 하드의 종류,하지만 난 당신이 경쟁 조건을보고있는 것 같아요. 이것은 내가 대부분의 시간에 일어난다 고 생각하는 것입니다.

  • 프로세스 A는 StreamWriter로 파일을 업데이트하고 파일을 잠급니다.
  • 프로세스 A가 업데이트를 완료하고 파일을 닫습니다.
  • FileSystemWatcher가 파일을 활성화하고 처리합니다. 당신이 통제 할 수없는 타이밍 문제로 인해 때때로

    는, 순서는 약간 다릅니다 :

  • 프로세스 A가 파일을 잠금의 StreamWriter를 가진 파일을 업데이트하고 있습니다.

  • FileSystemWatcher는 파일을 깨우고 처리합니다.
  • 프로세스 A가 업데이트를 완료하고 파일을 닫습니다.

    파일이 잠겨 있기 때문에 사용자의 감시자가 처리 할 수 ​​없습니다.

    예외가 발생하면 나중에 다시 시도해야합니다.

편집 : 코드를 살펴본 후에도 내 대답은 여전히 ​​의미가 있습니다.

+0

옛날 옛적에 한 프로세스에서 FileSystemWatcher를 사용하고 다른 프로세스를 사용하여 작성하는 것과 똑같은 문제가있었습니다. 당신이 말했듯이, 잠시 후 파일을 다시로드하려고 시도 할 때 오류가 발생했을 때이를 해결해야했습니다. –