c ++ inotify - 监视多个目录/子目录

时间:2014-06-08 13:46:18

标签: c++ inotify

首先,如果有比使用inotify更简单的方法,请告诉我!

基本上我想做的是使用带有这些标志的inotify来查看根目录:IN_CREATE | IN_MODIFY | IN_DELETE。 当它是IN_CREATE和IN_ISDIR时我也想看那个文件夹。但我需要的主要是即使在子目录中是否创建,删除或修改了文件。现在我知道我可以使用inotify_add_watch()添加多个目录,但是当我读取event-> name时,我怎么知道它属于哪个目录? inotify_event结构似乎不包含该值。所以,如果我有这样的结构:

/root

然后我创建一个目录“a”:

/root/a

然后创建一个文件:

/root/a/tmp.txt

当我读取event-> name时它只会说tmp.txt,但我怎么知道它在“a”子目录中呢?我怎么知道手表描述符是什么?

2 个答案:

答案 0 :(得分:0)

在inotify_event结构中,name字段包含事件发生的对象的名称,相对于wd。您需要获取父目录的绝对路径并连接文件/目录的名称以获取完整路径。 同样在Inotify_event结构中的掩码字段,您可以使用IN_ISDIR掩码位来了解该wd发生的事件是文件还是目录。

这是来自inotify here

  

只有在监视目录内的文件返回事件时,才会显示名称字段。它标识相对于监视目录的文件路径名。此路径名以空值终止,并且可以包括进一步的空字节,以将后续读取与合适的地址边界对齐。

答案 1 :(得分:0)

我是这样做的: 我在 inotify_add_watch() 时间创建了一个 hashmap (QHash fd_to_path) 将接收到的 wd 与其对应的目录字符串耦合:

int wd = inotify_add_watch(...next_dir_path..);
if (wd != -1)
    fd_to_path.insert(wd, next_dir_path);

然后在struct inotify_event之后读取收到的inotify事件时 *ev = (...);您只需使用以下命令查询相应的目录路径:

QString dir_path = fd_to_path.value(ev->wd);