func
(
w
*
Watch
)
WatchDir
(
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
{
return
err
err
=
w
.
Watch
.
Add
(
path
)
if
err
!=
nil
{
return
err
fmt
.
Println
(
"monitor:"
,
path
)
return
nil
go
func
(
)
{
for
{
select
{
case
ev
:=
<-
w
.
Watch
.
Events
:
nameExtension
:=
path
.
Ext
(
ev
.
Name
)
if
nameExtension
==
".jpg"
{
if
ev
.
Op
&
fsnotify
.
Create
==
fsnotify
.
Create
{
fmt
.
Println
(
"Create:"
,
ev
.
Name
)
fi
,
err
:=
os
.
Stat
(
ev
.
Name
)
if
err
==
nil
&&
fi
.
IsDir
(
)
{
w
.
Watch
.
Add
(
ev
.
Name
)
fmt
.
Println
(
"AddMonitor:"
,
ev
.
Name
)
fileName
:=
path
.
Base
(
ev
.
Name
)
if
runtime
.
GOOS
==
"windows"
{
fileName
=
filePathBase
(
ev
.
Name
)
if
err
:=
os
.
Chmod
(
ev
.
Name
,
0644
)
;
err
!=
nil
{
fmt
.
Println
(
"Error:"
,
err
)
str
:=
strings
.
Split
(
fileName
,
"-"
)
if
ev
.
Op
&
fsnotify
.
Write
==
fsnotify
.
Write
{
fmt
.
Println
(
"Write:"
,
ev
.
Name
)
if
ev
.
Op
&
fsnotify
.
Remove
==
fsnotify
.
Remove
{
fmt
.
Println
(
"删除文件:"
,
ev
.
Name
)
fi
,
err
:=
os
.
Stat
(
ev
.
Name
)
if
err
==
nil
&&
fi
.
IsDir
(
)
{
w
.
watch
.
Remove
(
ev
.
Name
)
fmt
.
Println
(
"删除监控:"
,
ev
.
Name
)
if
ev
.
Op
&
fsnotify
.
Rename
==
fsnotify
.
Rename
{
fmt
.
Println
(
"重命名文件:"
,
ev
.
Name
)
w
.
watch
.
Remove
(
ev
.
Name
)
if
ev
.
Op
&
fsnotify
.
Chmod
==
fsnotify
.
Chmod
{
fmt
.
Println
(
"修改权限:"
,
ev
.
Name
)
case
err
:=
<-
w
.
Watch
.
Errors
:
log
.
Println
(
"error:"
,
err
)
return
}
(
)
func
filePathBase
(
path
string
)
string
{
if
path
==
""
{
return
"."
for
len
(
path
)
>
0
&&
path
[
len
(
path
)
-
1
]
==
'\\'
{
path
=
path
[
0
:
len
(
path
)
-
1
]
if
i
:=
strings
.
LastIndex
(
path
,
"\\"
)
;
i
>=
0
{
path
=
path
[
i
+
1
:
]
if
path
==
""
{
return
"\\"
return
path
func
main
(
)
{
watch
,
_
:=
fsnotify
.
NewWatcher
(
)
w
:=
Watch
{
Watch
:
watch
,
go
w
.
WatchDir
(
"D:/WatchTest"
)
三、完整原文资料
golang 通过fsnotify监控文件,并通过文件变化重启程序
一、 需要下载的包go get github.com/fsnotify/fsnotify二、使用fsnotify监控文件type Watch struct { Watch *fsnotify.Watcher}func (w *Watch) WatchDir(dir string) { //通过walk来遍历目录下的所有子目录 filepath.Walk(dir, func(p...
全面的身份验证功能-注册,登录,更新密码,忘记密码,注销。
从安全的角度来看,Cors,Helmet,Api速率限制器已作为中间件包括在内。
用户可以注册其客户端和自定义HTML模板。
使用cron作业进行邮件调度(每天,每周,每月)。
订阅和付款(目前已经存根了付款,可以用任何合适的付款网关代替)。
可以通过任何客户端API使用Api服务器,但是为了便于交互-已包含CL
我们几乎每天都在使用编辑器来开发程序,你会发现你在编辑器之外的地方修改了内容,或者新建了
文件
,编辑器中会实时自动更新;再比如,你打开一个目录,然后 ctrl+n 复制一个,此时你在其中一个窗口中创建
文件
,另一个窗口也会自动更新,所以说,
文件
系统的
监控
几乎无处不在。
fs
notify
在
golang
中,我们可以使用
fs
notify
来实现,它内部也是调用的操作系统提供的i
notify
能力。它目前支持的平台
上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听
文件
修改进而自动重新加载。其内部使用的就是
fs
notify
这个库,它是跨平台的。今天我们就来介绍一下它。
$ go get github.com/
fs
notify
/
fs
notify
package main
import (
"log"
"github.com/
fs
notify
/
fs
notify
"
func main() {
watcher, err :=
fs
的使用比较简单:上面示例中,我们在另一个 goroutine 中循环读取发生的事件及错误,然后输出它们。编译、运行程序。在当前目录创建一个,然后重命名为
文件
,输入内容,然后删除它。观察控制台输出:
其实,重命名时会产生两个事件,一个是原
文件
的事件,一个是新
文件
的事件。注意,使用了操作系统接口,监听器中保存了系统资源