如何监视目录或文件是否在 C 中重命名?

问题描述

我正在使用 inotify instance 进行监控项目。网上搜了一下,有没有办法监控文件名或目录名有没有改名。

如果在 inotify instance 中无法实现,我如何在 C 中监视名称已更改的文件或目录?

解决方法

IN_MOVE_FROMIN_MOVED_TO 事件添加一个监视,指定文件或目录所在目录的路径。每当您收到此类事件时,请将事件 name 字段与您感兴趣的文件或目录名称进行比较。

通常,如果创建或修改了一个有趣的文件,您可能最终会观察 IN_CLOSE_WRITEIN_MOVED_TO 事件及其 name 字段;和 IN_DELETEIN_MOVED_FROM 事件,如果一个有趣的文件消失了。

Inotify 事件锚定在父目录 inode 中。也就是说,如果您拥有监视描述符的目录被移动,您会收到一个 IN_MOVE_SELF 事件,但您会继续接收其中的文件和目录的事件,即使它现在位于其他地方。

如果您对特定路径感兴趣,无论它们在程序启动时是否存在 - 您不能在尚不存在的目录上设置监视 - 您需要为每个目录创建一个监视描述符沿着那个路径直到根目录,就像一个链。其中一些您可能需要动态创建。如果其中之一被删除或移动,IN_DELETE_SELFIN_MOVE_SELF,它及其所有依赖的观察描述符都将被删除。每当现有目录获得 IN_CREATEIN_MOVED_TO 事件且 name 是一个有趣的子目录的名称时,您为其创建一个监视;但您还需要扫描子目录树以查找更多有趣的子子目录,因为这些子目录可能已经存在,或者可能是在您收到此事件和向新子目录添加监视之间创建的。

由于这种复杂性,使用“扁平”树层次结构更容易,您可以在其中监视程序启动时需要存在的一组固定目录。 (也就是说,您监视这些目录中是否有新的/删除的文件和目录,而不是它们的子目录。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...