c++ - NodeJS 文件系统观察两次或更多次抛出事件

标签 c++ events node.js filesystems inotify

我在 Ubuntu 上查看我的 NodeJS 服务器的配置文件:

for( var index in cfgFiles ) {
    fs.watch(cfgFiles[index], function(event, fileName) {
        logger.info("======> EVENT: " + event);
        updateConfigData(fileName);
    });
}

因此,每当我保存一个配置文件时,处理函数至少会收到两次相同文件名的“更改”事件,从而导致 updateConfigData() 被执行多次。我在使用 C++/iNotify 观看配置文件时遇到了同样的行为。

有谁知道导致这种行为的原因吗?

最佳答案

简答:不是Node,文件真的改了两次。

长答案

我在开发设置中使用了一种非常相似的方法。如果它是开发机器,我的管理器进程会监视所有 js 源文件,并在集群上重新启动子进程。

我没有注意这个,因为它只是开发设置;但是在我阅读了您的问题之后,我看了一下并意识到我有相同的行为。

我在本地计算机上编辑文件,每当我保存时,我的编辑器都会通过 sftp 更新它们。每次保存时,文件上的更改事件都会被触发两次。

我已经为 fs.watch 调用返回的 FSWatcher 对象检查了 listeners('change');但它只显示我的事件处理程序一次。

然后我做了我应该先做的测试:服务器上的“touch file.js”,它只触发了一次。所以,对我来说,它不是 Node;但是文件真的改了两次。当打开文件进行写入(而不是附加)时,它可能会触发更改,因为它清空了内容。然后当写入新内容时,它会第二次触发该事件。

这对我来说没有任何问题;但是如果你想阻止它,你可以在你的事件处理函数中进行奇偶控制,方法是保留每个文件的调用号,并只在偶数索引调用上做任何你做的事情。

关于c++ - NodeJS 文件系统观察两次或更多次抛出事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11080132/

相关文章:

JavaScript onclick 事件仅在双击时有效

javascript - 为什么我的函数在 NodeJS、Sequelize 中返回 null

node.js - Mongoose - 人口 MissingSchemaError

c++ - 帮我调试这个 - C++ Boost

c++ - 如何更新 QFileSystemModel 中的文件权限

c++ - 如何比较 C++ 中 lambda 函数的返回类型?

C++ - 使用 AMD 源库的链接错误

jquery - 使用 jQuery 按类选择 Angular JS 指令中 ng-repeat 创建的元素?

javascript - 在 Firefox 中检测页面加载完成事件

node.js - findall 多对多 Sequelize