簡體   English   中英

c ++ inotify - 觀察多個目錄/子目錄

[英]c++ inotify - watch multiple directories / subdirectories

首先,如果有比使用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”子目錄中? 我怎么知道手表描述符是什么?

在 inotify_event 結構中,name 字段包含發生事件的對象的名稱,相對於 wd。 您需要獲取父目錄的絕對路徑並連接文件/目錄的名稱以獲取完整路徑。 同樣在 Inotify_event 結構的掩碼字段中,您可以使用 IN_ISDIR 掩碼位來了解該 wd 發生的事件是文件還是目錄。

這是來自這里的inotify

name 字段僅在為監視目錄中的文件返回事件時出現; 它標識相對於監視目錄的文件路徑名。 此路徑名以空字符結尾,並且可能包含更多空字節以將后續讀取對齊到合適的地址邊界。

我是這樣做的:我在 inotify_add_watch() 時間創建了一個 hashmap (QHash<int, QString> 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 *ev = (...); 之后讀取收到的 inotify 事件時; 您只需使用以下命令查詢相應的目錄路徑:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM