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 @@
 	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 @@
 			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 @@
 	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 @@
 	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