问题描述
我正在使用 inotify instance
进行监控项目。网上搜了一下,有没有办法监控文件名或目录名有没有改名。
如果在 inotify instance
中无法实现,我如何在 C 中监视名称已更改的文件或目录?
解决方法
为 IN_MOVE_FROM
和 IN_MOVED_TO
事件添加一个监视,指定文件或目录所在目录的路径。每当您收到此类事件时,请将事件 name
字段与您感兴趣的文件或目录名称进行比较。
通常,如果创建或修改了一个有趣的文件,您可能最终会观察 IN_CLOSE_WRITE
和 IN_MOVED_TO
事件及其 name
字段;和 IN_DELETE
和 IN_MOVED_FROM
事件,如果一个有趣的文件消失了。
Inotify 事件锚定在父目录 inode 中。也就是说,如果您拥有监视描述符的目录被移动,您会收到一个 IN_MOVE_SELF
事件,但您会继续接收其中的文件和目录的事件,即使它现在位于其他地方。
如果您对特定路径感兴趣,无论它们在程序启动时是否存在 - 您不能在尚不存在的目录上设置监视 - 您需要为每个目录创建一个监视描述符沿着那个路径直到根目录,就像一个链。其中一些您可能需要动态创建。如果其中之一被删除或移动,IN_DELETE_SELF
或 IN_MOVE_SELF
,它及其所有依赖的观察描述符都将被删除。每当现有目录获得 IN_CREATE
或 IN_MOVED_TO
事件且 name
是一个有趣的子目录的名称时,您为其创建一个监视;但您还需要扫描子目录树以查找更多有趣的子子目录,因为这些子目录可能已经存在,或者可能是在您收到此事件和向新子目录添加监视之间创建的。
由于这种复杂性,使用“扁平”树层次结构更容易,您可以在其中监视程序启动时需要存在的一组固定目录。 (也就是说,您监视这些目录中是否有新的/删除的文件和目录,而不是它们的子目录。)