首先,如果有比使用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”子目录中呢?我怎么知道手表描述符是什么?
答案 0 :(得分:0)
在inotify_event结构中,name字段包含事件发生的对象的名称,相对于wd。您需要获取父目录的绝对路径并连接文件/目录的名称以获取完整路径。 同样在Inotify_event结构中的掩码字段,您可以使用IN_ISDIR掩码位来了解该wd发生的事件是文件还是目录。
这是来自inotify here
只有在监视目录内的文件返回事件时,才会显示名称字段。它标识相对于监视目录的文件路径名。此路径名以空值终止,并且可以包括进一步的空字节,以将后续读取与合适的地址边界对齐。
答案 1 :(得分:0)
我是这样做的:
我在 inotify_add_watch() 时间创建了一个 hashmap (QHash
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);