函数fs.watch的callback会执行多次
发布于 3 个月前 作者 muyoucun557 458 次浏览 来自 分享

场景描述 代码段如下: @{7%FQS8CD0CH)KEN1QQI80.png 操作如下: 在代码中制定文件夹中原本已有abc.txt,现将该文件重命名为aaa.txt,在控制台输出了3次。 控制台输出如下: ![3396_AU}Q%6R9`[S~]6JK]0.png](//dn-cnode.qbox.me/FgfRDZtO12aSEM3h_KRP2pOLoAh5) 由控制台可见callback回调了3次,这3次触发的事件分别为“rename”、“rename”、“change”。 问题:为何该函数要设计成这样,只回调一次不是更好吗?这样十分的不友好

5 回复

对文件监控感兴趣的可以关注一下chokidar模块

可能是临时文件的原因,跟操作系统有关

@hdumok 有验证的方法吗?

下面介绍一个比较友好的监控文件夹的模块。下面做个简述 watch模块。npm install watch。

方法:watch.createMonitor(root,options,callback)。 该方法创建一个监控器,监控root参数指定的文件夹。监控器并且作为参数传递给callback。 对于创建的监控器,有3个event ’created’: root下创建一个新的文件时会触发。该事件的callback有2个参数,filename(文件名) and stat(fs.stat). ‘removed’:文件删除或者移除时会触发。该事件的callback,有2个参数, filename and stat. ‘changed’:文件被改变之后会触发。该事件的callback,有3个参数,filename and currentStat(文件改变之后的stat)and previousSta(文件改变之前的stat)。

demo: watch.createMonitor("./floder",function(monitor){ //callback 有2个参数。filename:文件名 stat:文件的stat(node的fs.stat) monitor.on(“created”,function(filename,stat){ console.log(“added:”+filename); }); //callback 有2个参数。filename:文件名 stat:文件的stat(node的fs.stat) monitor.on(“removed”,function(filename,stat) { console.log(“removed:”+filename); });

//callback 有3个参数。filename:文件名  currentStat:文件的当前stat   previousStat:文件的改变前的stat
monitor.on("changed",function(filename,currentStat,previousStat){
	console.log("changed:"+filename);
});

}); 可见图片:

![3$M7@Q9EJDU(R8Y08%U4]X5.png](//dn-cnode.qbox.me/FnGNT7Yv5Kap7mjfzXqcjdUCnbrK)

tip:在文件夹里直接对文件进行重命名操作时,会先后触发’removed’和’added’。个人猜测是和操作系统有关,在进行重名操作时,操作系统会先removefile然后进行addfile。在使用fs.rename进行重命名操作时,现象也是一样的

@muyoucun557 没啥验证方法,只是觉得文件这种都是系统级的,node大概只是捕捉系统信号罢了。上面那段代码在win10和centos7 上试了下,结果跟题主也不一样,centos上新建文件时才有change的信事件win10上怎么操作都没change事件,两个系统上新建和删除都会产生rename事件 node6.5.0

回到顶部