본문 바로가기
golang

golang fsnotify를 이용한 폴더/파일 감시

by PudgeKim 2021. 5. 14.

fsnotify package를 이용하기전에 go get -u golang.org/x/sys/... 를 먼저 설치해야합니다.
그 후에 go get github.com/fsnotify/fsnotify 를 설치합니다.

 

1
2
3
4
5
watcher, err := fsnotify.NewWatcher()
if err != nil {
    log.Fatal(err)
}
defer func() { _ = watcher.Close() }()
cs

위처럼 watcher를 생성하고 defer을 이용하여 나중에 닫아줍니다.

그 후 golang의 os package, ioutil.TempDir, filepath.Join 등을 이용하여 감시하려는 폴더 변수를 생성합니다.
이렇게 생성된 폴더변수를 tempDir이라고 하겠습니다.

1
2
3
4
err = watcher.Add(tempDir)
if err != nil {
    log.Fatal(err)
}
cs

위처럼 Add함수를 이용하여 해당 폴더를 추가하면 감시 대상이 됩니다.

1
2
3
4
5
6
7
8
9
10
go func() {
    for {
        select {
            case event, ok := <- watcher.Events:
                if !ok { return }
                ...
                
        }
    }
}
cs

위처럼 고루틴에서 watcher.Event가 올때마다 체크하면서 폴더내에 변화를 체크해볼 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
targetFile := ".../someFile" // filepath.Join 등을 이용하는게 좋음
 
go func() {
    for {
        select {
            case event, ok := <- watcher.Events:
                if !ok { return }
                if event.Name == targetFile {
                    ...
                }
                
        }
    }
}
cs

만약 특정 파일이름을 체크하고 싶다면 위처럼 하면 될 것입니다.

1
2
3
4
case event.Op&fsnotify.Create == fsnotify.Create:
    ...
case event.Op&fsnotify.Remove == fsnotify.Remove:
    ...
cs

위 같은 코드로 감시하고 있는 폴더내에 파일이 생성/삭제 되었는지도 확인할 수 있습니다.