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 のファイルシステム関数の 1 つである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よりもかなり遅くなります。fs.watch

ファイルを監視すると、 のインスタンスが返されます。fs.FSWatcherこれには、イベントchangeとがありerrorます。呼び出し.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 に答える