package main import ( "fmt" "log" "os" "path/filepath" "strings" "time" "github.com/fsnotify/fsnotify" ) // Watches the downloads directory for autohotkey files and makes sure that only the newest one downloaded exists at a time func downloadsFileWatcher() { downloadsWatcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal("NewWatcher failed: ", err) } defer downloadsWatcher.Close() done := make(chan bool) go func() { defer close(done) defer log.Printf("file watcher go routine shutting down!") // could be from returns below? for { select { case event, ok := <-downloadsWatcher.Events: if !ok { log.Printf("downloads watcher _event_ NOT OK TERMINATING ARRRGGHGHH: %v", err) return } if event.Op == fsnotify.Create { if strings.Contains(event.Name, ".ahk") { err = cleanDownloadsAHK() if err != nil { log.Printf("failed to clean downloads: %v", err) } } } case err, ok := <-downloadsWatcher.Errors: if !ok { log.Printf("downloads watcher _error_ NOT OK TERMINATING ARRRGGHGHH: %v", err) return } log.Printf("downloads watcher error: %v", err) } } }() err = downloadsWatcher.Add(downloadsFolderPath) if err != nil { log.Fatal("downloads watcher add down failed:", err) } <-done } func cleanDownloadsAHK() error { err := filepath.Walk(downloadsFolderPath, func(path string, info os.FileInfo, err error) error { if err != nil { return fmt.Errorf("failed to walk file: %v", err) } // ignore files that aren't AHK if !strings.Contains(info.Name(), ".ahk") { return nil } // ignore files downloaded in the past 5 minutes if info.ModTime().After(time.Now().Add(time.Minute * -1)) { return nil } log.Printf("removing old .ahk file - %s", info.Name()) err = os.Remove(fmt.Sprintf("%s/%s", downloadsFolderPath, info.Name())) if err != nil { return fmt.Errorf("failed to delete old .ahk '%s': %v", info.Name(), err) } return nil }) if err != nil { return fmt.Errorf("failed to walk downloads directory: %v", err) } return nil }