NodeJS散列文件在目录中recursion地

我能够在目录中实现recursion文件遍历(即探索目录中的所有子目录和文件)。 为此,我已经使用堆栈溢出各自的post的答案 。 这个片段如下:

var fs = require("fs"); var tree = function(dir, done) { var results = { "path": dir, "children": [] }; fs.readdir(dir, function(err, list) { if (err) { return done(err); } var pending = list.length; if (!pending) { return done(null, results); } list.forEach(function(file) { fs.stat(dir + '/' + file, function(err, stat) { if (stat && stat.isDirectory()) { tree(dir + '/' + file, function(err, res) { results.children.push(res); if (!--pending){ done(null, results); } }); } else { results.children.push({"path": dir + "/" + file}); if (!--pending) { done(null, results); } } }); }); }); }; module.exports = tree; 

当我运行:

  tree(someDirectoryPath, function(err, results) { if (err) throw err; console.log(results); }); 

我得到一个样本结果,比如这个:

 { path: '/Users/UserName/Desktop/1', children: [ { path: '/Users/UserName/Desktop/1/file1' }, { path: '/Users/UserName/Desktop/1/file2' }, { path: '/Users/UserName/Desktop/1/file3' }, { path: '/Users/UserName/Desktop/1/subdir1', children: [Object] } ] } 

我也可以通过使用fs的模块ReadStream方法在特定位置散列单个文件。 这个片段如下:

 /** * Checking File Integrity */ var fs = require('fs'), args = process.argv.splice('2'), path = require('path'), traverse = require('/Users/UserName/Desktop/tree.js'), crypto = require('crypto'); //var algorithm = ['md5', 'sha1', 'sha256', 'sha512']; var algorithm = 'sha512'; var hashTable = new Array(); var hash = crypto.createHash(algorithm); var fileStream = fs.ReadStream(args[0]); fileStream.on('data', function(data) { hash.update(data); fileStream.on('end', function() { var digest = hash.digest('hex'); console.log('algorithm used: ', algorithm); console.log('hash for the file: ',digest); hashTable[args[0]] = digest; console.log(hashTable); }); }); 

args [0]存储要由ReadStream读取的文件的位置。 散列特定文件后,返回的控制台日志如下所示:

 node fileIntegrityChecker.js hello.txt algorithm used: sha512 hash for the file: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 the hashtable is: [ 'hello.txt': '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043' ] 

我的问题是 ,我试图以某种方式集成在散列相关的js文件中的树模块function。 我的想法是,程序将捕获用户的input, 作为目录的path,并且input将被处理以遍历文件夹的整个子目录和文件。 另外, fileStream.on方法应该包含在树模块的callback中。 不过,我并没有完全启动callback机制,希望能从中得到一些见解。

这是我试过的

 /** * Checking File Integrity */ var fs = require('fs'), args = process.argv.splice('2'), path = require('path'), tree = require('/Users/UserName/Desktop/tree.js'), crypto = require('crypto'); //var algorithm = ['md5', 'sha1', 'sha256', 'sha512']; var algorithm = 'sha512'; var hashTable = new Array(); var pathString = 'Users/UserName/Desktop/1'; tree(pathString, function(err, results) { if (err) throw err; var hash = crypto.createHash(algorithm); var fileStream = fs.ReadStream(results.children[1]['path']); fileStream.on('data', function(data) { hash.update(data); fileStream.on('end', function() { var digest = hash.digest('hex'); console.log('algorithm used: ', algorithm); console.log('hash for the file: ',digest); hashTable[results.children[1]['path']] = digest; console.log('The hashtable is: ', hashTable); }); }); }); 

现在,我已经取得了一些进展,我没有收到任何错误。 基本上我达到了我的范围。 不过,我能够明确地只提取一个结果。 出于某种原因,我想不出如何迭代(例如)得到每个孩子的结果JSON对象。 如果解决了这个问题,我觉得这个问题将会彻底解决。

你能告诉我一个方法如何成功地结合模块和js文件recursion遍历目录的所有内容,并为其中的每个文件创build一个哈希。 我需要这个来最终检查文件是否发生了一些变化,基于它们的哈希值。 谢谢!

最简单的事情就是在你已经走过目录树的时候生成哈希。 这涉及到更新tree.js文件,如下所示:

  } else { var fname = dir + "/" + file}; // put your hash generation here generateHash(fname, function (e, hash) { if (e) done(e); results.children.push({"path": fname, "hash" : hash); if (!--pending) { done(null, results); } }); } 

然后把你的哈希代码放在这样一个函数中:

 function generateHash (filename, callback) { var algorithm = 'sha512'; var hashTable = new Array(); var hash = crypto.createHash(algorithm); var fileStream = fs.ReadStream(filename); fileStream.on('data', function(data) { hash.update(data); }); fileStream.on('end', function() { var digest = hash.digest('hex'); callback(null, digest); }); } 

使用vinyl-fs ,你可以遍历一个目录。 这可能会大大减less你的代码。

然后你会通过一个处理程序来生成你的散列。

这是一个例子:

 fs.src(['./**/*.js']) .pipe(hasher) .pipe(concater) .dest('output.file')