[c#] FileSystemWatcher를 사용하여 디렉토리 모니터링

Windows Forms 응용 프로그램을 사용하여 디렉터리를 모니터링하고 여기에 놓인 파일을 다른 디렉터리로 이동하고 있습니다.

현재 파일을 다른 디렉토리로 복사하지만 다른 파일이 추가되면 오류 메시지없이 종료됩니다. 때로는 세 번째 파일로 끝나기 전에 두 개의 파일을 복사합니다.

콘솔 앱이 아닌 Windows Form 애플리케이션을 사용하고 있기 때문입니까? 프로그램 종료를 중지하고 디렉토리를 계속 감시 할 수있는 방법이 있습니까?

private void watch()
{
  this.watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += OnChanged;
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}

public void Dispose()
{
  // avoiding resource leak
  watcher.Changed -= OnChanged;
  this.watcher.Dispose();
}



답변

문제는 알림 필터였습니다. 프로그램이 여전히 복사중인 파일을 열려고했습니다. LastWrite를 제외한 모든 알림 필터를 제거했습니다.

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastWrite;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}


답변

당신은 파일 처리 코드를 제공하지 않았지만, 나는 당신이 그런 일을 처음 작성할 때 모든 사람들이 똑같은 실수를했다고 가정합니다. filewatcher 이벤트는 파일이 생성되는 즉시 발생합니다. 그러나 파일이 완료되는 데 약간의 시간이 걸립니다. 예를 들어 1GB의 파일 크기를 사용하십시오. 파일은 다른 프로그램 (Explorer.exe에서 복사)에 의해 생성 될 수 있지만 해당 프로세스를 완료하는 데 몇 분 정도 걸립니다. 이벤트는 생성시 발생하며 파일을 복사 할 준비가 될 때까지 기다려야합니다.

루프 에서이 함수를 사용하여 파일이 준비 될 때까지 기다릴 수 있습니다 .


답변

그 이유는 watcher가 메서드에 대한 지역 변수로 선언되고 메서드가 완료되면 가비지 수집되기 때문일 수 있습니다. 클래스 멤버로 선언해야합니다. 다음을 시도하십시오.

FileSystemWatcher watcher;

private void watch()
{
  watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}


답변