Skip to content

Instantly share code, notes, and snippets.

@Narven
Forked from hiroakis/fsnotify_example.go
Created October 14, 2021 19:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Narven/cde3c2e28e062a2afcb887023c4aadcc to your computer and use it in GitHub Desktop.
Save Narven/cde3c2e28e062a2afcb887023c4aadcc to your computer and use it in GitHub Desktop.
fsnotify example: Detect file changes in real time.
package main
import (
"log"
"os"
"time"
"github.com/fsnotify/fsnotify"
)
func waitUntilFind(filename string) error {
for {
time.Sleep(1 * time.Second)
_, err := os.Stat(filename)
if err != nil {
if os.IsNotExist(err) {
continue
} else {
return err
}
}
break
}
return nil
}
func main() {
if len(os.Args) != 2 {
log.Fatalln("error")
}
filename := os.Args[1]
err := waitUntilFind(filename)
if err != nil {
log.Fatalln(err)
}
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatalln(err)
}
defer watcher.Close()
err = watcher.Add(filename)
if err != nil {
log.Fatalln(err)
}
renameCh := make(chan bool)
removeCh := make(chan bool)
errCh := make(chan error)
go func() {
for {
select {
case event := <-watcher.Events:
switch {
case event.Op&fsnotify.Write == fsnotify.Write:
log.Printf("Write: %s: %s", event.Op, event.Name)
case event.Op&fsnotify.Create == fsnotify.Create:
log.Printf("Create: %s: %s", event.Op, event.Name)
case event.Op&fsnotify.Remove == fsnotify.Remove:
log.Printf("Remove: %s: %s", event.Op, event.Name)
removeCh <- true
case event.Op&fsnotify.Rename == fsnotify.Rename:
log.Printf("Rename: %s: %s", event.Op, event.Name)
renameCh <- true
case event.Op&fsnotify.Chmod == fsnotify.Chmod:
log.Printf("Chmod: %s: %s", event.Op, event.Name)
}
case err := <-watcher.Errors:
errCh <- err
}
}
}()
go func() {
for {
select {
case <-renameCh:
err = waitUntilFind(filename)
if err != nil {
log.Fatalln(err)
}
err = watcher.Add(filename)
if err != nil {
log.Fatalln(err)
}
case <-removeCh:
err = waitUntilFind(filename)
if err != nil {
log.Fatalln(err)
}
err = watcher.Add(filename)
if err != nil {
log.Fatalln(err)
}
}
}
}()
log.Fatalln(<-errCh)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment