0

在不将文件存储在数据库中的情况下,比较文件哈希的最简单方法是什么?

例如:

var filename = __dirname + '/../public/index.html';
var shasum = crypto.createHash('sha1');

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  shasum.update(d);
});

s.on('end', function() {
  var d = shasum.digest('hex');
  console.log(d + ' ' + filename);

  fs.writeFile(__dirname + "/../public/log.txt", d.toString() + '\n', function(err) {
     if(err) {
         console.log(err);
      } else {
         console.log("The file was saved!");
      }
  }); 
});

上面的代码返回 HTML 文件的哈希值。如果我编辑文件,我如何知道它是否已更改?换句话说,我如何知道哈希是否已更改?

有什么建议么?

已编辑

现在哈希被保存在日志文件中。如何从文件中检索哈希并将其与新生成的哈希匹配?一个代码示例会让我更好地理解。

这个问题没有区别,但我还不清楚如何实现它。

4

2 回答 2

1

如果您要查找文件的更改,则可以使用 Node 的文件系统函数之一,fs.watch. 这是它的使用方式:

fs.watch(filename, function (event, filename) {
  //event is either 'rename' or 'change'
  //filename is the name of the file which triggered the event
});

但是手表功能不是很一致,因此您可以将fs.watchFile其用作替代方案。fs.watchFile使用 stat 轮询,因此它比fs.watch立即检测文件更改要慢很多。

观看文件将返回 的实例fs.FSWatcher,其中包含事件changeerror。调用.close将停止监视文件的更改。

这是与您的代码相关的示例:

var filename = __dirname + '/../public/index.html';
var shasum = crypto.createHash('sha1');

var oldhash = null;

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  shasum.update(d);
});

s.on('end', function() {
  var d = shasum.digest('hex');
  console.log(d + ' ' + filename);
  oldhash = d.toString();

  fs.writeFile(__dirname + "/../public/log.txt", d.toString() + '\n', function(err) {
     if(err) {
         console.log(err);
      }
      else {
         console.log("The file was saved!");
      }
  }); 
});

//watch the log for changes
fs.watch(__dirname + "/../public/log.txt", function (event, filename) {
  //read the log contents
  fs.readFile(__dirname + "/../public/log.txt", function (err, data) {
    //match variable data with the old hash
    if (data == oldhash) {
      //do something
    }
  });
});
于 2013-04-11T05:20:10.787 回答
0

这个问题和你上一个问题有什么区别?如果您不想将其存储在数据库中,请将其存储为文件。如果您想保存多个文件的哈希,则可以将它们放在 JSON 对象中并将它们写为 .json 文件,以便它们易于读/写。

编辑

鉴于您在问题中添加的内容,它应该非常简单。您可以编写一个函数来进行检查和重写:

function updateHash (name, html, callback) {
    var sha = crypto.createHash('sha1');
    sha.update(html);
    var newHash = sha.digest('hex');

    var hashFileName = name + '.sha';

    fs.readFile(hashFileName, 'utf8', function (err, oldHash) {
        var changed = true;
        if (err)
            console.log(err); // probably indicates the file doesn't exist, but you should consider doing better error handling

        if (oldHash === newHash)
            changed = false;

        fs.writeFile(hashFileName, newHash, { encoding: 'utf8' }, function (err) {
            callback(err, changed);
        });
    });
}

updateHash('index.html', "<html><head><title>...", function (err, isChanged) {
    // do something with this information ?
    console.log(isChanged);
});
于 2013-04-11T04:38:54.343 回答