【问题标题】:How to monitor if a directory or file is renamed in C?如何监视目录或文件是否在 C 中重命名?
【发布时间】:2021-05-29 12:58:42
【问题描述】:

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

如果在inotify instance 中不可能,我如何监控C 中更改名称的文件或目录?

【问题讨论】:

  • 头脑风暴(我没有使用 inotify 接口的经验):文件(或目录)的名称不是该特定文件(或目录)的一部分......它是目录中包含的条目文件,因此您应该监视父目录的更改。
  • @pmg 如何在 C 中监视文件或目录名称?
  • 我没有使用 inotify 接口的经验 ==> 请参阅手册页:man7.org/linux/man-pages/man7/inotify.7.html
  • C 可能不是解决此问题的正确工具,因为不可避免地您最终会执行系统调用,那么为什么不使用 shell 脚本呢?
  • Iirc,你需要注意IN_MOVE_SELF事件。

标签: c linux inotify


【解决方案1】:

添加一个监视,指定文件或目录所在目录的路径,用于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 是一个有趣的子目录的名称,您就为它创建一个监视;但是您还需要扫描子目录树以查找更多有趣的子子目录,因为这些子目录可能已经存在,或者可能是在您收到此事件的时间和您向新子目录中添加手表时创建的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2017-03-27
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多