美文网首页Golang与区块链
gobox中处理文件系统通知

gobox中处理文件系统通知

作者: ligang1109 | 来源:发表于2018-07-15 21:58 被阅读3次

今天来说下使用gobox中inotify来处理文件系统通知

inotify介绍

inotify是linux系统的文件事件通知机制,例如我们想得知某个文件是否被改变,目录的读写情况等,都可以使用这个机制。

用法示例

package main

import (
    "github.com/goinbox/inotify"

    "fmt"
    "path/filepath"
)

func main() {
    path := "/tmp/a.log"

    watcher, _ := inotify.NewWatcher()
    watcher.AddWatch(path, inotify.IN_ALL_EVENTS)
    watcher.AddWatch(filepath.Dir(path), inotify.IN_ALL_EVENTS)

    for i := 0; i < 5; i++ {
        events, _ := watcher.ReadEvents()
        for _, event := range events {
            if watcher.IsUnreadEvent(event) {
                fmt.Println("it is a last remaining event")
            }
            showEvent(event)
        }
    }

    watcher.Free()
    fmt.Println("bye")
}

func showEvent(event *inotify.Event) {
    fmt.Println(event)

    if event.InIgnored() {
        fmt.Println("inotify.IN_IGNORED")
    }

    if event.InAttrib() {
        fmt.Println("inotify.IN_ATTRIB")
    }

    if event.InModify() {
        fmt.Println("inotify.IN_MODIFY")
    }

    if event.InMoveSelf() {
        fmt.Println("inotify.IN_MOVE_SELF")
    }

    if event.InMovedFrom() {
        fmt.Println("inotify.IN_MOVED_FROM")
    }

    if event.InMovedTo() {
        fmt.Println("inotify.IN_MOVED_TO")
    }

    if event.InDeleteSelf() {
        fmt.Println("inotify.IN_DELETE_SELF")
    }

    if event.InDelete() {
        fmt.Println("inotify.IN_DELETE")
    }

    if event.InCreate() {
        fmt.Println("inotify.IN_CREATE")
    }
}

如示例,我们监听了/tmp/a.log/tmp目录的文件系统事件。

执行程序,接下来我们做如下操作:

ligang@vm-xubuntu /tmp $ echo a > a.log
ligang@vm-xubuntu /tmp $ echo aa >> a.log
ligang@vm-xubuntu /tmp $ mv a.log b.log
ligang@vm-xubuntu /tmp $ rm b.log
rm: remove regular file 'b.log'? y

得到输出:

&{1 256 0 /tmp a.log}
inotify.IN_CREATE
&{1 32 0 /tmp a.log}
&{1 2 0 /tmp a.log}
inotify.IN_MODIFY
&{1 8 0 /tmp a.log}
&{1 32 0 /tmp a.log}
&{1 2 0 /tmp a.log}
inotify.IN_MODIFY
&{1 8 0 /tmp a.log}
&{1 64 1801 /tmp a.log}
inotify.IN_MOVED_FROM
&{1 128 1801 /tmp b.log}
inotify.IN_MOVED_TO
&{1 512 0 /tmp b.log}
inotify.IN_DELETE
bye

inotify对系统编程开发有着很大的意义, 如果对inotify不是很熟悉,我在这里推荐阅读Linux/UNIX系统编程手册:https://book.douban.com/subject/25809330/

欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!

相关文章

  • gobox中处理文件系统通知

    今天来说下使用gobox中inotify来处理文件系统通知 inotify介绍 inotify是linux系统的文...

  • gobox中的consumer处理框架

    我们都会有从异步队列中消费的需求,今天来说下gobox中的consumer处理框架 consumer处理架构图 重...

  • gobox中的http请求处理框架

    今天来说下使用gobox中的http请求处理框架 http请求处理架构图 重要的对象 System system用...

  • zookeeper场景运用及原理

    ZooKeeper提供了什么? 文件系统 通知机制 Zookeeper文件系统 Zookeeper通知机制 客户端...

  • gobox中的分页操作

    今天来说下使用gobox中的分页操作 说明 分页也是我们开发时的一个常见需求,gobox中提供了page包做这个事...

  • gobox中的simplecache和levelcache

    今天来说下gobox中的simplecache和levelcache simplecache simplecach...

  • gobox中的shardmap

    今天来说下gobox中的shardmap。 golang中的map使用简单,但并发写入时,如果不加锁,会导致pan...

  • gobox中redis操作

    今天来说下使用gobox中redis操作相关 说明 本包的driver部分使用了redigo:https://gi...

  • gobox中的httpclient

    今天来说下使用gobox中httpclient,这个包就相当于命令行的curl工具,用于发起http请求。 重要的...

  • gobox中mysql操作

    今天来说下使用gobox中mysql操作相关 说明 本包的driver部分使用了go-sql-driver:htt...

网友评论

    本文标题:gobox中处理文件系统通知

    本文链接:https://www.haomeiwen.com/subject/gdrmpftx.html