NodeJS检测修改的文件

应用程序加载用户的文本文件,每个用户都可以更改。 在应用程序的开始,我想检查是否有任何文件从上次更改。 我认为最有效的方法是计算每个文件的校验和并保存到一个json文件。 在应用程序的开始,我会检查每个文件的校验和,并将其与从json文件中的数据进行比较是否有任何更优化/有效的方式来做到这一点? 或者如何计算文件校验和?

我相信使用fs.stat和检查'最后修改'比阅读整个文件和比较校验和,因为它只是元数据(而你实际上没有读取整个文件 )要快得多。

此外,如果您的文件位于不同的目录中,您可以testing一个文件夹是否已更改。 这可以减lessI / O调用(如果最后修改date没有改变,你可以跳过检查该文件夹上的文件)。

你将不得不存储“最后修改”的date,我会使用Redis的。 您将需要在每次修改更改和当然第一次运行时更新它。

这里是一个函数(和一个函数调用)来testing一个文件或文件夹是否被改变:

 let fs = require('fs'); let moment = require('moment'); let path = 'views'; //your folder path (views is an example folder) wasFileChanged(path, (err,wasChanged) => { if (wasChanged){ console.log('folder was changed, need to compare files'); //need to update redis here //...comapre files to find what was changed } else{ console.log('folder was not changed'); } }); /** * Checks if a file/folder was changed */ function wasFileChanged(path, callback) { fs.open(path, 'r', (err, fd) => { if (err) { return callback (err); } else { //obtain previous modified date of the folder (I would use redis to store/retrieve this data) let lastModifed = '2016-12-03T00:41:12Z'; //put the string value here, this is just example fs.stat(path, (err, data) => { console.log('check if file/folder last modified date, was it after my last check '); //I use moment module to compare dates let previousLMM = moment(lastModifed); let folderLMM = moment(data.mtime.toISOString()); let res = !(folderLMM.isSame(previousLMM, 'second')); //seconds granularity return callback (null, res); }); } }); } 

像这个博客是一个很好的阅读你: http ://blog.tompawlak.org/calculate-checksum-hash-nodejs-javascript

代码示例(来自博客):

 var crypto = require('crypto'); function checksum (str, algorithm, encoding) { return crypto .createHash(algorithm || 'md5') .update(str, 'utf8') .digest(encoding || 'hex') } 

从文件读取并显示其哈希值:

 fs.readFile('test.dat', function (err, data) { checksum(data); // e53815e8c095e270c6560be1bb76a65d checksum(data, 'sha1'); // cd5855be428295a3cc1793d6e80ce47562d23def }); 

比较校验和以查找文件是否被更改是有效的,并且还可以比较文件最后一次使用fs.stat修改的fs.stat