使用 inotify 检查监视文件夹中的文件是不是被覆盖

Posted

技术标签:

【中文标题】使用 inotify 检查监视文件夹中的文件是不是被覆盖【英文标题】:Using inotify to check if files in a watched folder are overwritten使用 inotify 检查监视文件夹中的文件是否被覆盖 【发布时间】:2016-05-20 03:15:49 【问题描述】:

我编写了一个使用inotify 来监视特定文件夹的C 程序。我希望在此文件夹中创建新文件或现有文件被覆盖时收到通知(即文件夹已包含 a.txt,我将 a.txt 的较新副本复制到此文件夹中,实质上是覆盖它) .

当使用IN_CREATE 掩码将新文件添加到此文件夹时,我能够生成通知,但在第二种情况下我没有收到任何通知。我试过IN_MODIFYIN_ATTRIB,都没有用。

是否可以通知第二种情况?

【问题讨论】:

【参考方案1】:

如果您覆盖文件,您将不会收到 IN_MODIFY 和 IN_ATTRIB 事件。因为,文件没有被修改,文件属性也没有改变。覆盖等于创建一个新文件。所以,你可以分别尝试这两个事件。

IN_MODIFY:-

此事件仅在文件被修改时发生。要通知此事件,您可以尝试更新或删除监视列表文件中的一些内容。

IN_ATTRIB:-

此事件仅在文件属性更改时发生。属性表示文件元数据。因此,如果要获取文件的此事件,可以在监视列表文件中更改文件权限。

确保,你想看到这个事件,你必须在事件列表中添加以下事件,当你的 inotify 被初始化时。

In_MODIFY IN_ATTRIB

【讨论】:

对于 inotify 时间戳不属于该属性,我不知道为什么。但我敢肯定,我曾尝试过这种情况。我正在更改文件的修改时间,但它不会给出 IN_ATTRIB 事件。而且我正在修改一个文件,那个时候文件修改时间也改变了。如果您想通过您的程序获得确切的事件,您可以尝试使用名为“inotifywait”的系统内置命令。

以上是关于使用 inotify 检查监视文件夹中的文件是不是被覆盖的主要内容,如果未能解决你的问题,请参考以下文章

inotify 是不是可以让我监视所有具有特定扩展名的文件,无论它们在磁盘上的啥位置?

C语言中的inotify文件

哪些操作系统支持 Java 中的本机(类似 inotify)文件监视

当文件被删除并再次创建时,inotify 停止监视文件

osquery inotify 是不是在目录或文件上安装观察程序

在 perl 中使用 inotify 监视多个文件