改进gfsnotify,支持编辑器对文件非标准编辑时(RENAME+CHMOD)的热更新问题

This commit is contained in:
John 2018-11-11 11:26:03 +08:00
parent 6ff44ad123
commit 882c69cb08
3 changed files with 44 additions and 13 deletions

View File

@ -207,19 +207,31 @@ func (w *Watcher) startEventLoop() {
for {
if v := w.events.Pop(); v != nil {
event := v.(*Event)
// 如果是删除操作,那么需要判断是否文件真正不存在了
if event.IsRemove() {
if fileExists(event.Path) {
// 如果是文件删除事件,判断该文件是否存在,如果存在,那么将此事件认为“假删除”,
// 并重新添加监控(底层fsnotify会自动删除掉监控这里重新添加回去)
w.watcher.Add(event.Path)
// 修改事件操作为重命名(相当于重命名为自身名称,最终名称没变)
event.Op = RENAME
} else {
// 如果是真实删除,那么递归删除监控信息
w.Remove(event.Path)
}
fmt.Println(event)
fmt.Println(fileExists(event.Path))
switch {
// 如果是删除操作,那么需要判断是否文件真正不存在了,如果存在,那么将此事件认为“假删除”
case event.IsRemove():
if fileExists(event.Path) {
// 重新添加监控(底层fsnotify会自动删除掉监控这里重新添加回去)
// 注意这里调用的是底层fsnotify添加监控只会产生回调事件并不会使回调函数重复注册
w.watcher.Add(event.Path)
// 修改事件操作为重命名(相当于重命名为自身名称,最终名称没变)
event.Op = RENAME
} else {
// 如果是真实删除,那么递归删除监控信息
w.Remove(event.Path)
}
// 如果是删除操作,那么需要判断是否文件真正不存在了,如果存在,那么将此事件认为“假命名”
// (特别是某些编辑器在编辑文件时会先对文件RENAME再CHMOD)
case event.IsRename():
if fileExists(event.Path) {
// 重新添加监控
w.watcher.Add(event.Path)
}
}
callbacks := w.getCallbacks(event.Path)
// 如果创建了新的目录,那么将这个目录递归添加到监控中
if event.IsCreate() && fileIsDir(event.Path) {

View File

@ -6,6 +6,6 @@
</head>
<body>
<H1>姓名 {{.name}}</H1>
12311
12345678910
</body>
</html>

View File

@ -0,0 +1,19 @@
package main
import (
"gitee.com/johng/gf/g/os/gfsnotify"
"gitee.com/johng/gf/g/os/glog"
)
// 对同一个文件多次Add是否超过系统inotify限制
func main() {
path := "/Users/john/temp/log"
for i := 0; i < 9999999; i++ {
_, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
glog.Println(event)
})
if err != nil {
glog.Fatalln(err)
}
}
}