Node.js NodeJS在目录中递归地散列文件
我能够在目录中实现递归文件遍历(即探索目录中的所有子目录和文件)。为此,我使用了来自堆栈溢出上的相应post的。其中的片段如下所示:Node.js NodeJS在目录中递归地散列文件,node.js,recursion,hash,integrity,Node.js,Recursion,Hash,Integrity,我能够在目录中实现递归文件遍历(即探索目录中的所有子目录和文件)。为此,我使用了来自堆栈溢出上的相应post的。其中的片段如下所示: var fs = require("fs"); var tree = function(dir, done) { var results = { "path": dir, "children": [] }; fs.readdir(dir, function(err, list) { if (err) {
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;
/**
* 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);
});
});
当我跑步时:
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的modulereadstream方法在特定位置散列单个文件。其代码段如下所示:
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;
/**
* 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' ]
} 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);
}
});
}
我的问题是我试图以某种方式将树模块功能集成到与哈希相关的js文件中。我的想法是,程序将捕获用户的输入,作为指向目录的路径,并对输入进行处理,以遍历文件夹的整个子目录和文件。另外,树模块的回调中应该包括fileStream.on
方法。但是,我还没有完全熟悉回调机制,我希望从您那里获得一些见解
这就是我尝试过的
/**
* 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文件结合起来,以递归方式遍历目录的所有内容,并为其中的每个文件创建哈希。我需要它来根据文件的哈希值最终检查文件中是否发生了一些更改。谢谢大家!最简单的方法是在遍历目录树时生成哈希。这涉及更新tree.js文件,如下所示:
node fileIntegrityChecker.js hello.txt
algorithm used: sha512
hash for the file: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
the hashtable is: [ 'hello.txt': '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043' ]
} 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);
});
}
使用,您可以全局访问一个目录。这可能会大大减少您的代码
然后,您将通过一个处理程序对文件进行管道传输,该处理程序将生成您的哈希
下面是一个例子:
fs.src(['./**/*.js'])
.pipe(hasher)
.pipe(concater)
.dest('output.file')
看起来不错。EISDIR意味着当需要不同的文件类型时,您正在尝试对目录执行操作。您跟踪了哪一行抛出错误了吗?行树(someDirectoryPath,function(err,results){给出了错误。因此,这意味着问题可能是当我将变量someDirectory传递到树()时函数。@chriskelly我做了一些更改,你能检查一下吗?检查过。让我知道我的答案是否清楚。请给我几分钟。我正在尝试更新我的代码。如果有不清楚的地方,我会告诉你。谢谢。当我试着运行你的代码时,出现以下错误:binding.open(pathModule.\u makeLong(path),^TypeError:path必须是字符串。控制台抛出var fileStream=fs.ReadStream(filename)行;显然我有一些内存泄漏。(节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个端点侦听器。使用emitter.setMaxListeners()增加限制。crypto.js:126返回此。\u handle.digest(outputEncoding)^Error:ReadStream的Hash.digest(crypto.js:126:23)处的错误(本机)未初始化。(/Users/MacriniciDan/Desktop/tree2.js:17:31)ReadStream.emit(events.js:129:20)处的_stream_readable.js:908:16处的进程。_tickCallback(node.js:355:11)谢谢!它现在可以工作了。谢谢你所有的努力和解决方案!回调(null,digest)行和函数(e,hash)之间有有趣的链接。我想我现在更了解回调了。再次感谢!