Skip to content

illarion/gonotify

Repository files navigation

Gonotify

Simple Golang inotify wrapper.

GoDoc

Provides following primitives:

  • Low level

    • Inotify - wrapper around inotify(7)
    • InotifyEvent - generated file/folder event. Contains Name (full path), Wd - watch descriptor and Mask that describes the event.
  • Higher level

    • FileWatcher - higher level utility, helps to watch the list of files for changes, creation or removal
    • DirWatcher - higher level utility, recursively watches given root folder for added, removed or changed files.
    • FileEvent - embeds InotifyEvent and keeps additional field Eof to notify user that there will be no more events.

Use FileWatcher and DirWatcher as an example and build your own utility classes.

Usage

package main

import (
  "fmt"
  "github.com/illarion/gonotify/v2"
  "time"
  "context"
)

func main() {

  ctx, cancel := context.WithCancel(context.Background())

  watcher, err := gonotify.NewDirWatcher(ctx, gonotify.IN_CREATE|gonotify.IN_CLOSE, "/tmp")
  if err != nil {
    panic(err)
  }

  main:
  for {
    select {
    case event := <-watcher.C:
      fmt.Printf("Event: %s\n", event)

      if event.Is(gonotify.IN_CREATE) {
        fmt.Printf("File created: %s\n", event.Name)
      }

      if event.IsAny(gonotify.IN_CLOSE, gonotify.IN_CLOSE_WRITE) {
        fmt.Printf("File closed: %s\n", event.Name)
      }

    case <-time.After(5 * time.Second):
      fmt.Println("Good bye!")
      cancel()
      break main
    }
  }
  
  // Wait for watcher to finish all internal goroutines
  <-watcher.Done()
  fmt.Println("Watcher is done")
  
}

License

MIT. See LICENSE file for more details.