golang实现文件的新增,删除,编辑,进行通知

lu569368 · · 733 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
### Go的文件系统通知 ** 文章转自go语言中文文档 [http://www.topgoer.com](http://www.topgoer.com/?from=studygolang "文章转自go语言中文文档http://www.topgoer.com") ** 官网地址:https://github.com/fsnotify/fsnotify fsnotify利用golang.org/x/sys而不是syscall从标准库。通过运行以下命令确保已安装最新版本: ``` go get -u golang.org/x/sys/... ``` ### 常问问题 当文件移到另一个目录时,仍在监视它吗? 不(不应该这样,除非您正在观看它的移动位置)。 当我查看目录时,是否也监视所有子目录? 不,您必须为要观看的任何目录添加监视(路线图#18上有一个递归监视程序)。 我是否必须在单独的goroutine中观看错误和事件通道? 截至目前,是的。正在考虑使此单线程友好(请参阅howeyc#7) 为什么我在OS X上收到同一文件的多个事件? 在OS X上对Spotlight进行索引可能会导致多个事件(请参见howeyc#62)。临时的解决方法是将您的文件夹添加到Spotlight隐私设置中,直到我们具有本机FSEvents实现(请参阅#11)。 一次可以查看多少个文件? 对于可创建的手表数量,存在特定于操作系统的限制: + Linux:/ proc / sys / fs / inotify / max_user_watches包含该限制,达到此限制将导致“设备上没有剩余空间”错误。 + BSD / OSX:sysctl变量“ kern.maxfiles”和“ kern.maxfilesperproc”达到这些限制会导致“打开的文件太多”错误。 为什么通知不能与NFS文件系统或用户空间(FUSE)中的文件系统一起使用? fsnotify需要底层操作系统的支持才能正常工作。当前的NFS协议不为文件通知提供网络级别的支持。 ```go package main import ( "fmt" "log" "os" "path/filepath" "github.com/fsnotify/fsnotify" ) func main() { watch, _ := fsnotify.NewWatcher() w := Watch{ watch: watch, } w.watchDir("./web") select {} } type Watch struct { watch *fsnotify.Watcher } 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 } } return nil }) log.Println("监控服务已经启动") go func() { for { select { case ev := <-w.watch.Events: { if ev.Op&fsnotify.Create == fsnotify.Create { fmt.Println("创建文件 : ", ev.Name) fi, err := os.Stat(ev.Name) if err == nil && fi.IsDir() { w.watch.Add(ev.Name) fmt.Println("添加监控 : ", ev.Name) } } if ev.Op&fsnotify.Write == fsnotify.Write { fmt.Println("写入文件 : ", 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) } } case err := <-w.watch.Errors: { fmt.Println("error : ", err) return } } } }() } ```

有疑问加站长微信联系

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

733 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传