...
此外也可能通过New
方法创建一个监控管理对象之后再进行监控管理。其中,添加监控的时候需要给定触发监控时的回调函数,参数类型为*gfsnotify.Event
对象指针。
添加监听
package main
import (
"github.com/gogf/gf/os/gfsnotify"
"github.com/gogf/gf/os/glog"
)
func main() {
// /home/john/temp 是一个目录,当然也可以指定文件
path := "/home/john/temp"
_, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
if event.IsCreate() {
glog.Println("创建文件 : ", event.Path)
}
if event.IsWrite() {
glog.Println("写入文件 : ", event.Path)
}
if event.IsRemove() {
glog.Println("删除文件 : ", event.Path)
}
if event.IsRename() {
glog.Println("重命名文件 : ", event.Path)
}
if event.IsChmod() {
glog.Println("修改权限 : ", event.Path)
}
glog.Println(event)
})
// 移除对该path的监听
// gfsnotify.Remove(path)
if err != nil {
glog.Fatalln(err)
} else {
select {}
}
}
...
当我们在/home/john
目录下创建/删除/修改文件时,可以看到gfsnotify
监控到了文件的修改并输出了对应的事件信息。
移除监听
移除监听我们可以使用Remove
方法,会移除对整个文件/目录的监听。
...
package main
import (
"github.com/gogf/gf/os/gfsnotify"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/os/gtime"
"time"
)
func main() {
callback, err := gfsnotify.Add("/home/john/temp", func(event *gfsnotify.Event) {
glog.Println("callback")
})
if err != nil {
panic(err)
}
// 在此期间创建文件、目录、修改文件、删除文件
// 20秒后移除回调函数注册,所有的回调都移除,不再有任何打印信息输出
gtime.SetTimeout(20*time.Second, func() {
gfsnotify.RemoveCallback(callback.Id)
glog.Println("remove callback")
})
select {}
}
fs.inotify.max_user_instances与fs.inotify.max_user_watches
在*nix
系统下,gfsnotify
模块使用的是系统的inotify
特性来实现的文件/目录监控,因此该功能在使用时会受到系统的两个内核函数限制:
...