IT_World

[golang] 폴더/파일 감시 fsnotify 본문

Programming language/go lang

[golang] 폴더/파일 감시 fsnotify

engine 2021. 9. 29. 07:36

os : linux / ubuntu shell 기준

순서

1. go get -u golang.org/x/sys/...설치

go get -u golang.org/x/sys/...

2. go get github.com/fsnotify/fsnotify 를 설치

go get github.com/fsnotify/fsnotify

설치완료


code  내부 설명

watcher, err := fsnotify.NewWatcher()
    checkError(err)
    defer watcher.Close()
/*
 watcher를 생성하고 defer을 이용해서 나중에 닫아준다.
그 후 golang의 os package, ioutil.TempDir, filepath.Join 등을 이용해서 감시하려는 폴더 변수를 생성
*/

/*
func checkError(err){
  if err != nil {
      log.Fatal(err)
  }
}
*/
    go func() {
        for {
            select {
            case event := <-watcher.Events:
                switch event.Op {
                case fsnotify.Create:
                    createSymLink(event.Name, false)
                case fsnotify.Remove, fsnotify.Rename:
                    deleteSymLink(event.Name, false)
                }
            case err := <-watcher.Errors:
                checkError(err)
            }
        }
    }()
/*
go func() = 고루틴
고루틴에서 watcher.Event가 올때마다 체크하면서 폴더 내 변화를 체크해볼 수 있다.

파일 생성 시 createSymLink(event.Name, false) 실행
파일 삭제나 이동시 deleteSymLink(event.Name, false) 실행
*/
 // 파일을 처음 감시자에 추가
    for _, d := range DIRS {
        err := watcher.Add(d)
        checkError(err)
     done := make(chan bool)// 동기 채널 생성
        // monitor events
        go func() {
            for {
                select {
                case event := <-watcher.Events:
                    switch event.Op {
                    case fsnotify.Create:
                        createSymLink(event.Name, false)
                    case fsnotify.Remove, fsnotify.Rename:
                        deleteSymLink(event.Name, false)
                    }
                case err := <-watcher.Errors:
                    checkError(err)
                }
            }
        }()
        // 파일을 처음 감시자에 추가
        for _, d := range DIRS {
            err := watcher.Add(d)
            checkError(err)
        }
        <-done // 채널에 값이 들어올 때까지 대기

전체코드

package main
import (
	"github.com/fsnotify/fsnotify"
)

func main() {
	monitorFile()
}
func monitorFile() {
    // 탐색시작
    watcher, err := fsnotify.NewWatcher()
    checkError(err)
    defer watcher.Close()

    done := make(chan bool)//동기 채널 생성 chan=채널
    // monitor events
    go func() {
        for {
            select {
            // 송신 채널로부터 값을 올때까지 기다리다가 오면event에 입력
            case event := <-watcher.Events:
                switch event.Op {
                case fsnotify.Create:
                    createSymLink(event.Name, false)
                case fsnotify.Remove, fsnotify.Rename:
                    deleteSymLink(event.Name, false)
                }
            case err := <-watcher.Errors:
                checkError(err)
            }
        }
    }()
    // 파일을 처음 감시자에 추가
    for _, d := range DIRS {
        err := watcher.Add(d)
        checkError(err)
    }
    <-done //채널에 값이 들어올 때까지 대기, 값을 꺼냄
}

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

Comments