mirror of
https://gitee.com/johng/gf.git
synced 2024-12-01 11:48:09 +08:00
改进gfsnotify,支持编辑器对文件非标准编辑时(RENAME+CHMOD)的热更新问题
This commit is contained in:
parent
6ff44ad123
commit
882c69cb08
@ -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) {
|
||||
|
@ -6,6 +6,6 @@
|
||||
</head>
|
||||
<body>
|
||||
<H1>姓名 : {{.name}}</H1>
|
||||
12311
|
||||
12345678910
|
||||
</body>
|
||||
</html>
|
19
geg/os/gfsnotify/gfsnotify_limit.go
Normal file
19
geg/os/gfsnotify/gfsnotify_limit.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user