从 node.js 检测文件内容更改
Detect file content changes from node.js
我有一个简单的文件观察器构建 chokidar
require('chokidar').watch('./target.txt', {}).on('all', function(event, path) {
console.log(event, path);
}).on('ready', function() {
console.log('ready');
});
每次我重新保存文件时都会导致 change
事件,即使没有更改。有没有办法让这个火灾事件只有在实际内容被改变的情况下才发生?
您可以使用 add
和 change
上提供的 stats
参数。这仅适用于文件大小的更改,这对于绝大多数情况应该足够了。
var watchSize = 0;
require('chokidar').watch('./target.txt', {}).on('all', function(event, path, stats) {
if(stats && stats.size != watchSize) {
watchSize = stats.size;
console.log(event);
}
}).on('ready', function(path, stats) {
console.log('ready');
});
如果剩下的几个情况确实与你的情况相关,并且你没有性能问题,你可以使用这样的东西(按照评论中的建议):
var crypto = require("crypto");
var fs = require("fs");
var chokidar = require("chokidar");
watchFile("./target.txt");
//----------------------------------------------------
function watchFile(filePath){
var watchHash;
chokidar.watch(filePath, {}).on("all", function(event, path, stats) {
if (event == "add" || event == "change"){
getHash(filePath, function(hash){
if (hash != watchHash){
watchHash = hash;
console.log(event);
}
});
}
});
}
//----------------------------------------------------
function getHash(filePath, callback){
var stream = fs.ReadStream(filePath);
var md5sum = crypto.createHash("md5");
stream.on("data", function(data) {
md5sum.update(data);
});
stream.on("end", function() {
callback(md5sum.digest("hex"));
});
}
虽然这似乎有点多。
我有一个简单的文件观察器构建 chokidar
require('chokidar').watch('./target.txt', {}).on('all', function(event, path) {
console.log(event, path);
}).on('ready', function() {
console.log('ready');
});
每次我重新保存文件时都会导致 change
事件,即使没有更改。有没有办法让这个火灾事件只有在实际内容被改变的情况下才发生?
您可以使用 add
和 change
上提供的 stats
参数。这仅适用于文件大小的更改,这对于绝大多数情况应该足够了。
var watchSize = 0;
require('chokidar').watch('./target.txt', {}).on('all', function(event, path, stats) {
if(stats && stats.size != watchSize) {
watchSize = stats.size;
console.log(event);
}
}).on('ready', function(path, stats) {
console.log('ready');
});
如果剩下的几个情况确实与你的情况相关,并且你没有性能问题,你可以使用这样的东西(按照评论中的建议):
var crypto = require("crypto");
var fs = require("fs");
var chokidar = require("chokidar");
watchFile("./target.txt");
//----------------------------------------------------
function watchFile(filePath){
var watchHash;
chokidar.watch(filePath, {}).on("all", function(event, path, stats) {
if (event == "add" || event == "change"){
getHash(filePath, function(hash){
if (hash != watchHash){
watchHash = hash;
console.log(event);
}
});
}
});
}
//----------------------------------------------------
function getHash(filePath, callback){
var stream = fs.ReadStream(filePath);
var md5sum = crypto.createHash("md5");
stream.on("data", function(data) {
md5sum.update(data);
});
stream.on("end", function() {
callback(md5sum.digest("hex"));
});
}
虽然这似乎有点多。