From: NitroCao <17915615+NitroCao@users.noreply.github.com> Date: Thu, 21 Apr 2022 06:46:51 +0000 (+0800) Subject: Add a feature to return the directories and files that are being monitored (#374) X-Git-Tag: v1.7.2~122 X-Git-Url: https://go.fuhry.dev/?a=commitdiff_plain;h=ceba4ef83ad7912d1ccf0b59e1ed8a13176f23b3;p=fsnotify.git Add a feature to return the directories and files that are being monitored (#374) * Add a feature to return the directories and files that are being monitored * add WatchList() method for bsd and windows platforms * preallocate space for the array to be returned --- diff --git a/inotify.go b/inotify.go index eb87699..a6d0e0e 100644 --- a/inotify.go +++ b/inotify.go @@ -163,6 +163,19 @@ func (w *Watcher) Remove(name string) error { return nil } +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + type watch struct { wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) diff --git a/inotify_test.go b/inotify_test.go index f121c01..bb6db09 100644 --- a/inotify_test.go +++ b/inotify_test.go @@ -459,3 +459,40 @@ func TestInotifyOverflow(t *testing.T) { numDirs*numFiles, creates) } } + +func TestInotifyWatchList(t *testing.T) { + testDir := tempMkdir(t) + defer os.RemoveAll(testDir) + testFile := filepath.Join(testDir, "testfile") + + handle, err := os.Create(testFile) + if err != nil { + t.Fatalf("Create failed: %v", err) + } + handle.Close() + + w, err := NewWatcher() + if err != nil { + t.Fatalf("Failed to create watcher: %v", err) + } + defer w.Close() + + err = w.Add(testFile) + if err != nil { + t.Fatalf("Failed to add testFile: %v", err) + } + err = w.Add(testDir) + if err != nil { + t.Fatalf("Failed to add testDir: %v", err) + } + + value := w.WatchList() + + w.mu.Lock() + defer w.mu.Unlock() + for _, entry := range value { + if _, ok := w.watches[entry]; !ok { + t.Fatal("return value of WatchList is not same as the expected") + } + } +} diff --git a/kqueue.go b/kqueue.go index 368f5b7..6fb8d85 100644 --- a/kqueue.go +++ b/kqueue.go @@ -148,6 +148,19 @@ func (w *Watcher) Remove(name string) error { return nil } +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + // Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME diff --git a/windows.go b/windows.go index b0105ae..ddc69ef 100644 --- a/windows.go +++ b/windows.go @@ -97,6 +97,21 @@ func (w *Watcher) Remove(name string) error { return <-in.reply } +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for _, entry := range w.watches { + for _, watchEntry := range entry { + entries = append(entries, watchEntry.path) + } + } + + return entries +} + const ( // Options for AddWatch sysFSONESHOT = 0x80000000