NodeJS 检测修改过的文件
NodeJS detect modified files
应用加载用户的文本文件,每个文件都可以由用户更改。
在应用程序启动时,我想检查自上次以来是否更改了任何文件。
我认为最有效的方法是计算每个文件的校验和并保存到一个 json 文件中。
在应用程序启动时,我将检查每个文件校验和并将其与 json 文件中的数据进行比较
还有其他 optimal/efficient 方法吗?或者如何准确计算文件校验和?
看来这个博客很适合你: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
并检查 'last modified' 比读取整个文件并比较校验和要快得多,因为它只是元数据(而且您 实际上并没有读取整个文件).
此外,如果您的文件位于不同的目录中,您可以测试文件夹是否已更改。这可以减少 I/O 调用(如果上次修改日期未更改,您可以跳过检查该文件夹中的文件)。
您必须存储 'last modified' 日期,为此我会使用 Redis。您需要在每次修改更改时更新它,当然在第一次 运行 时更新它。
这里有一个函数(和一个函数调用)来测试文件或文件夹是否被更改:
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);
});
}
});
}
应用加载用户的文本文件,每个文件都可以由用户更改。 在应用程序启动时,我想检查自上次以来是否更改了任何文件。 我认为最有效的方法是计算每个文件的校验和并保存到一个 json 文件中。 在应用程序启动时,我将检查每个文件校验和并将其与 json 文件中的数据进行比较 还有其他 optimal/efficient 方法吗?或者如何准确计算文件校验和?
看来这个博客很适合你: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
并检查 'last modified' 比读取整个文件并比较校验和要快得多,因为它只是元数据(而且您 实际上并没有读取整个文件).
此外,如果您的文件位于不同的目录中,您可以测试文件夹是否已更改。这可以减少 I/O 调用(如果上次修改日期未更改,您可以跳过检查该文件夹中的文件)。
您必须存储 'last modified' 日期,为此我会使用 Redis。您需要在每次修改更改时更新它,当然在第一次 运行 时更新它。
这里有一个函数(和一个函数调用)来测试文件或文件夹是否被更改:
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);
});
}
});
}