2016-12-02 18 views
1

アプリケーションはユーザーのテキストファイルを読み込み、それぞれはユーザーによって変更できます。 アプリの起動時に、前回以降にファイルが変更されたかどうかをチェックしたいと思います。 私は、最も効率的な方法は、各ファイルのチェックサムを計算し、1つのjsonファイルに保存することだと思う。 アプリの起動時に、私は各ファイルチェックサムをチェックし、それをjsonファイルのデータと比較します これを行うための最適/効率的な方法はもうありますか?または、ファイルチェックサムの正確な計算方法は?このブログのようなNodeJSは変更されたファイルを検出します

+0

は、ファイルの最終更新タイムスタンプをチェックする方が簡単ではないでしょうか? –

答えて

1

は(そして、あなたが実際にファイル全体を読んでいない)ファイル全体を読み込み、それが唯一のメタデータであるとして、チェックサムを比較するよりもはるかに高速です。

また、ファイルが異なるディレクトリにある場合は、フォルダが変更されたかどうかをテストできます。これは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); 
     }); 
    } 
    }); 
} 
+0

はい、それは考えです。私は、私に各ファイルを読み込ませないようなものがあるべきであることを知っていました。そして、私の目的のために「lastModifies」がうまく適合しています。私はあなたにそのコードについて書かれていましたが、アイデアで十分です:pありがとう –

+0

フォルダが変更されたかどうかをテストできますか?フォルダ内のファイルの内容が変更されている場合、フォルダのmtimeは変更されません。https://stackoverflow.com/questions/3620684/directory-last-modified-date –

+1

@SidVishnoiフォルダが変更されたかどうかを確認するには最初にmtime(ファイル/フォルダが追加/削除されていれば十分でしょう)を確認し、fsを使用してファイルのリストを取得し、既存のファイルが変更されたかどうかを確認します。 mtimeと既存のすべてのファイルが変更されなかった場合、そのフォルダは変更されませんでした。 – RLaaa

2

sSeemsはあなたのために良いの読み取りです: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

0を使用してファイルが最後に変更されたときを比較することもできます私は fs.statを使用すると「最終更新」をチェックすると信じて
+0

私はそれを見ましたが、私はこれについては分かりません。それは多くのファイルを読み込み、実際にそれらのすべてを読むことが最良の選択肢ではないようです。私はこれの効率を恐れています。多分、私の場合にはより適切なものがあるかもしれません。 –

+0

@PiotrWójciknode.jsには、[crypto](https://nodejs.org/api/crypto.html)のサポートが組み込まれている可能性があります。その可用性を確認することは、 。 – traktor53

関連する問題