2012-11-17 1 views
2

Go에서 핫 폴더로 디렉토리를 설정하려고합니다. 해당 디렉토리에 파일 작성이 끝나면 함수가 호출되어야합니다.Go에서 핫 폴더/파일 쓰기를 기다립니다.

이제 https://github.com/howeyc/fsnotify과 같은 핫 폴더에 대한 좋은 구성 요소 인 것으로 보입니다.

내 문제는 fsnotify가 쓰기 도중 "파일 변경됨"이벤트를 많이 내 보낸다는 것이지만 끝나면 아무 것도 표시되지 않으므로 프로세스가 파일을 쓰는 것을 볼 수 없다고 생각합니다.

그래서 "마지막으로 '파일이 변경되었습니다'이벤트가 발생한 후 1 초 후에 내 기능을 실행하는 것이 좋습니다. 그러나 이것이 문제를 해결하는 가장 좋은 방법인지 확신 할 수 없으며 실제로 어떻게해야하는지 잘 모릅니다. (주어진 GitHub의 페이지에서) 메인 이벤트 루프에서 깨끗하게이 통합 :

for { 
    select { 
    case ev := <-watcher.Event: 
     log.Println("event:", ev) 
    case err := <-watcher.Error: 
     log.Println("error:", err) 
    } 
} 

어떤 생각을/조언을 어떤 이벤트가 다음 적어도 1 초 동안 수신되지 때까지

+0

애플리케이션이 크로스 플랫폼이어야합니까? 예를 들어, Linux 기반 시스템에서는'inotifywatch'를 생성하여 'CLOSE_WRITE'유형의 이벤트 만 모니터링하고 출력을 구문 분석하여 생성/열려진 파일에 대한 알림을 얻은 후 닫힌 상태로 작성하는 것이 가능합니다 . – kostix

+0

글쎄, 나는 그것을 교차 plattform 필요하지만 내 솔루션이 충분하지 않다면, 나는 당신의 제안, 감사합니다 돌아 올께! – topskip

답변

5

다음 코드가 대기? f()으로 전화하십시오.

for { 
    timer := time.NewTimer(1*time.Second) 

    select { 
    case ev := <-watcher.Event: 
     log.Println("event:", ev) 
    case err := <-watcher.Error: 
     log.Println("error:", err) 
    case <-timer.C: 
     f() 
    } 

    timer.Stop() 
} 
+0

좋은 아이디어. 이제 두 단계 접근법을 취했습니다 : 먼저 "CREATE"이벤트를 찾은 다음 작성한 때까지 "대기"하도록 지정한 것과 같은 루프로 이동합니다. – topskip

+0

이 개념을 아주 잘 실행합니다. : 엄지 손가락 업 : – Daniel