IT_World
[golang] 폴더/파일 감시 fsnotify 본문
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 //채널에 값이 들어올 때까지 대기, 값을 꺼냄
}
위 같은 코드로 감시하고 있는 폴더내에 파일이 생성/삭제 되었는지도 확인할 수 있다.
'Programming language > go lang' 카테고리의 다른 글
[Go lang] shell 창에서 man Makefile 실행 (0) | 2021.10.01 |
---|---|
[Go Lang] makefile로 build를 한 번에 (0) | 2021.09.30 |
[Golang] test GoConvey 테스트 프레임워크 라이브러리 (0) | 2021.09.28 |
[go lang] go get go install 차이점 및 설치, 사용방법 (0) | 2021.09.15 |
Ubuntu 18.04 LTS에 Golang 최신버전 설치하기 (0) | 2021.09.13 |
Comments