• 添加监听
  • 移除监听
  • fs.inotify.max_user_instances与fs.inotify.max_user_watches

    gfsnotify能监控指定文件/目录的改变,如文件的增加、删除、修改、重命名等操作。

    使用方式

    1. import "github.com/gogf/gf/g/os/gfsnotify"

    接口文档

    https://godoc.org/github.com/gogf/gf/g/os/gfsnotify

    推荐使用gfsnotify模块提供的AddRemove模块方法,用于添加监控和取消监控。推荐原因见随后章节说明。

    此外也可能通过New方法创建一个监控管理对象之后再进行监控管理。其中,添加监控的时候需要给定触发监控时的回调函数,参数类型为*gfsnotify.Event对象指针。

    添加监听

    1. package main
    2. import (
    3. "github.com/gogf/gf/g/os/gfsnotify"
    4. "github.com/gogf/gf/g/os/glog"
    5. )
    6. func main() {
    7. // /home/john/temp 是一个目录,当然也可以指定文件
    8. path := "/home/john/temp"
    9. _, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
    10. if event.IsCreate() {
    11. glog.Println("创建文件 : ", event.Path)
    12. }
    13. if event.IsWrite() {
    14. glog.Println("写入文件 : ", event.Path)
    15. }
    16. if event.IsRemove() {
    17. glog.Println("删除文件 : ", event.Path)
    18. }
    19. if event.IsRename() {
    20. glog.Println("重命名文件 : ", event.Path)
    21. }
    22. if event.IsChmod() {
    23. glog.Println("修改权限 : ", event.Path)
    24. }
    25. glog.Println(event)
    26. })
    27. // 移除对该path的监听
    28. // gfsnotify.Remove(path)
    29. if err != nil {
    30. glog.Fatalln(err)
    31. } else {
    32. select {}
    33. }
    34. }

    其中/home/john参数为一个目录,gfsnotify.Add方法默认为递归监控,也就是说当目录下的文件(包括子目录下的文件)发生变化时,也会收到文件监控信息回调。

    当我们在/home/john目录下创建/删除/修改文件时,可以看到gfsnotify监控到了文件的修改并输出了对应的事件信息。

    移除监听

    移除监听我们可以使用Remove方法,会移除对整个文件/目录的监听。

    当对同一个文件/目录存在多个监听回调时,我们可以通过RemoveCallback方法移除指定的回调。方法参数callbackId是在添加监听时返回的Callback对象的唯一ID。

    使用示例1:

    1. package main
    2. import (
    3. "github.com/gogf/gf/g/os/gfsnotify"
    4. "github.com/gogf/gf/g/os/glog"
    5. "github.com/gogf/gf/g/os/gtime"
    6. "time"
    7. )
    8. func main() {
    9. c1, err := gfsnotify.Add("/home/john/temp/log", func(event *gfsnotify.Event) {
    10. glog.Println("callback1")
    11. })
    12. if err != nil {
    13. panic(err)
    14. }
    15. c2, err := gfsnotify.Add("/home/john/temp/log", func(event *gfsnotify.Event) {
    16. glog.Println("callback2")
    17. })
    18. if err != nil {
    19. panic(err)
    20. }
    21. // 5秒后移除c1的回调函数注册,仅剩c2
    22. gtime.SetTimeout(5*time.Second, func() {
    23. gfsnotify.RemoveCallback(c1.Id)
    24. glog.Println("remove callback c1")
    25. })
    26. // 10秒后移除c2的回调函数注册,所有的回调都移除,不再有任何打印信息输出
    27. gtime.SetTimeout(10*time.Second, func() {
    28. gfsnotify.RemoveCallback(c2.Id)
    29. glog.Println("remove callback c2")
    30. })
    31. select {}
    32. }

    使用示例2:

    1. package main
    2. import (
    3. "github.com/gogf/gf/g/os/gfsnotify"
    4. "github.com/gogf/gf/g/os/glog"
    5. "github.com/gogf/gf/g/os/gtime"
    6. "time"
    7. )
    8. func main() {
    9. callback, err := gfsnotify.Add("/home/john/temp", func(event *gfsnotify.Event) {
    10. glog.Println("callback")
    11. })
    12. if err != nil {
    13. panic(err)
    14. }
    15. // 在此期间创建文件、目录、修改文件、删除文件
    16. // 20秒后移除回调函数注册,所有的回调都移除,不再有任何打印信息输出
    17. gtime.SetTimeout(20*time.Second, func() {
    18. gfsnotify.RemoveCallback(callback.Id)
    19. glog.Println("remove callback")
    20. })
    21. select {}
    22. }

    fs.inotify.max_user_instances与fs.inotify.max_user_watches

    *nix系统下,gfsnotify模块使用的是系统的inotify特性来实现的文件/目录监控,因此该功能在使用时会受到系统的两个内核函数限制:

    • fs.inotify.max_user_instances:表示当前用户可创建的inotify监控实例数量,即gfsnotify.New方法创建的Watcher对象数量,一个Watcher对象对应系统的一个inotify实例,系统默认数量为:128

    • fs.inotify.max_user_watches:表示一个inotify实例可添加的监控文件队列大小,往同一个inotify添加的监控文件超过该数量限制则会失败,并且会有系统错误日志,系统默认数量往往为:8192(有的系统该数值会比较大一些);