【问题标题】:NodeJS detect modified filesNodeJS 检测修改过的文件
【发布时间】:2017-04-17 23:07:03
【问题描述】:

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

【问题讨论】:

  • 检查文件的最后修改时间戳不是更简单吗?

标签: javascript json node.js file checksum


【解决方案1】:

看来这个博客很适合你阅读: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比较文件上次修改的时间

【讨论】:

  • 我看到了,但我不确定。它将加载大量文件,并且真正阅读所有文件似乎不是最好的选择。我害怕这个效率。也许有更适合我的情况
  • @PiotrWójcik node.js 可能内置了crypto 支持。检查其可用性是链接中的第二个项目符号。
【解决方案2】:

我相信使用fs.stat 并检查“上次修改”比读取整个文件并比较校验和要快得多,因为它只是元数据(而且您实际上并没有读取整个文件) .

此外,如果您的文件位于不同的目录中,您可以测试文件夹是否已更改。这可以减少 I/O 调用(如果上次修改日期没有更改,您可以跳过检查该文件夹中的文件)。

您必须存储“最后修改”日期,我会使用 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);
      });
    }
  });
}

【讨论】:

  • 是的,这是一个想法。我知道应该有一些东西不会强迫我阅读每个文件,并且'lastModifies'非常适合我的目的。我会和你争论那个代码,但想法对我来说就足够了:p 谢谢
  • 如何测试文件夹是否被更改?如果修改了文件夹中的文件内容,则文件夹的 mtime 不会改变:stackoverflow.com/questions/3620684/…
  • @SidVishnoi 要检查文件夹是否已更改,您可以先检查 mtime(如果添加/删除文件/文件夹就足够了),然后使用 fs 获取文件列表并检查是否有现有文件已更改。如果 mtime 和所有现有文件都没有更改,那么文件夹没有。
  • 或者我们可以创建所有子文件的 mtime 哈希并进行比较.. 这就是我的想法。还有更有效的方法吗?
  • last modified 在不同系统中是否相同?如果文件被下载,last modified 日期不会更改为下载时间吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2010-12-09
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多