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

c++ watch multiple directories / subdirectories

本文关键字:子目录 监视 c++      更新时间:2023-10-16

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

基本上,我想做的是用inotify观察一个根目录,用这些标志:IN_CREATE | IN_MODIFY | IN_DELETE。当它是IN_CREATE和IN_ISDIR时,我也想看那个文件夹。但我需要的主要是文件是否被创建,删除或修改,甚至在子目录中。现在我知道我可以使用inotify_add_watch()添加多个目录,但是当我读取事件->名称时,我如何知道它属于哪个目录?inotify_event结构似乎没有保存这个值。如果我有一个这样的结构体:

/root

然后创建目录"a":

/root/a

创建一个文件:

/root/a/tmp.txt

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

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

这是来自通知

name字段只在被监视目录下的文件返回事件时出现;它标识相对于被监视目录的文件路径名。该路径名以空结束,并且可能包含更多的空字节,以便将后续读取与合适的地址边界对齐。

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

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

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

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