【官方操作】
Go
package main
import (
"log"
"github.com/fsnotify/fsnotify"
)
func main() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
done := make(chan bool)
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
log.Println("event:", event)
if event.Op&fsnotify.Write == fsnotify.Write {
log.Println("modified file:", event.Name)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
log.Println("error:", err)
}
}
}()
err = watcher.Add("E:\\test")
if err != nil {
log.Fatal(err)
}
<-done
}
这个只是监控最顶层的目录,如果是子目录的话,就监控不到,所以需要遍历下子目录,依次加入到监控器中
Go
func watchDir(watcher *fsnotify.Watcher,dir string) {
// 遍历子目录
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
// 判断是否为目录,只需要监听目录,目录下的文件变化就可以进行相应操作
if info.IsDir(){
path, err := filepath.Abs(path)
if err != nil {
log.Println(err)
return err
}
// 然后将其加入监听
if err := watcher.Add(path);err!=nil{
log.Printf("watch %s failed. err = %s",path,err.Error())
return err
}
}
return nil
})
}
watchDir(watcher,"E:\\test")
途中需要新增监控目录的话,需要判断下是否是目录,是的话,直接用Add进入即可
Go
// 如果是目录,则加入监控
fi, err := os.Stat(event.Name)
if err == nil && fi.IsDir() {
watcher.Add(event.Name)
fmt.Printf("===新增监控:【%s】\n", event.Name)
}
fsnotify有几种监控类型,分别当有哪些行为的时候,会触发
-
Create :当在监控的目录下创建新的文件或目录时,会触发此事件。例如,使用
touch
命令创建新文件,或者使用mkdir
命令创建新目录。 -
Write :当监控的文件被写入数据时,会触发此事件。例如,使用
echo
或,重定向操作向文件写入数据。 -
Remove :当监控的文件或目录被删除时,会触发此事件。例如,使用
rm
命令删除文件或目录。 -
Rename :当监控的文件或目录被重命名或者被移动到其他位置时,会触发此事件。例如,使用
mv
命令重命名文件或目录。 -
Chmod :当监控的文件或目录的权限被改变时,会触发此事件。例如,使用
chmod
命令改变文件或目录的权限。
操作两大类型 :文件 + 目录
文件:新增、修改、删除、重命名、修改权限
-
新增:Create + Chmod
-
修改:Create + Write + Rename
-
重命名:Rename + Create
-
删除:remove
目录:新增、删除、重命名、修改权限
-
重命名(难点): rename + create
- 先rename,在create新目录,最后rename
-
新增:create
-
删除: remove
-
修改权限: