func ( w * Watch ) WatchDir ( dir string ) { //通过walk来遍历目录下的所有子目录 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 //开启一个goroutine来处理监控对象的事件 go func ( ) { for { select { case ev := <- w . Watch . Events : //判断事件发生的类型 //create 创建 //path.Ext路径最后的扩展名 nameExtension := path . Ext ( ev . Name ) //只创建写入.jpg文件 if nameExtension == ".jpg" { if ev . Op & fsnotify . Create == fsnotify . Create { fmt . Println ( "Create:" , ev . Name ) //这里获取新创建文件的信息,如果是目录,则加入监控中 //如果有nameExtension == ".jpg" 限制,则无法创建文件夹。 fi , err := os . Stat ( ev . Name ) if err == nil && fi . IsDir ( ) { w . Watch . Add ( ev . Name ) fmt . Println ( "AddMonitor:" , ev . Name ) //将ev.Name的路径和文件名拆分出来; //path.Base()拆分linux目录;filePathBase()拆分windows目录;filePathBase()自己根据path.Bath()改的方法 fileName := path . Base ( ev . Name ) //Linux platform if runtime . GOOS == "windows" { fileName = filePathBase ( ev . Name ) //Windows platform //修改文件的权限;0644可读 if err := os . Chmod ( ev . Name , 0644 ) ; err != nil { fmt . Println ( "Error:" , err ) //使用strings.Split()方法将文件名保存成数组;此处根据需要编写。 str := strings . Split ( fileName , "-" ) //write 写入 if ev . Op & fsnotify . Write == fsnotify . Write { fmt . Println ( "Write:" , ev . Name ) //remove 删除 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 ) //rename 重命名 if ev . Op & fsnotify . Rename == fsnotify . Rename { fmt . Println ( "重命名文件:" , ev . Name ) //如果重命名文件是目录,则移除监控 //注意这里无法使用os.Stat 来判断是否是目录了: // 因为重命名后,go已经无法找到源文件来获取信息了,所以直接简单粗暴的使用remove就可以 w . watch . Remove ( ev . Name ) //chmod 修改权限 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 "." // Strip trailing slashes. for len ( path ) > 0 && path [ len ( path ) - 1 ] == '\\' { path = path [ 0 : len ( path ) - 1 ] // Find the last element if i := strings . LastIndex ( path , "\\" ) ; i >= 0 { path = path [ i + 1 : ] // If empty now, it had only slashes. 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 中循环读取发生的事件及错误,然后输出它们。编译、运行程序。在当前目录创建一个,然后重命名为 文件 ,输入内容,然后删除它。观察控制台输出: 其实,重命名时会产生两个事件,一个是原 文件 的事件,一个是新 文件 的事件。注意,使用了操作系统接口,监听器中保存了系统资源