(function(){ // var fs = require('fs'); var path = require('path'); var crypto = require('crypto'); // function _get_attributes(itemName,basePath) { // //console.info(basePath,"\t\t\t",itemName); // var retSize = 0; // var retHash = crypto.createHash('md5'); // . var retInfo; // var filepath = path.join(basePath,itemName); // var stat = fs.statSync(filepath); // if( stat.isDirectory() ) { // retInfo = {}; // var items = fs.readdirSync(filepath); var hashs = []; for(var i in items) { // var attr = _get_attributes(items[i],filepath); // retSize += attr[0]; // hashs.push(attr[1]); // retInfo[ items[i] ] = attr; } // hashs.sort(); for(var j in hashs) { retHash.update(hashs[j]); } } else { // retSize = stat.size; // // var buffer = new Buffer(64*1024); // var fdr = fs.openSync(filepath, 'rs'); while(true) { // var bytesRead = fs.readSync(fdr, buffer,0,buffer.length); if(bytesRead>0) { // retHash.update(buffer.slice(0,bytesRead)); } else { // break; } } // fs.closeSync(fdr); // retInfo = stat.mtime.toISOString(); } // // base64 '='. return [retSize,retHash.digest('base64').replace(/=/g,''),retInfo]; } // module.exports = function(_basepath) { return _get_attributes('',_basepath); } })();
// var fs = require('fs'); var path = require('path'); var crypto = require('crypto'); var async = require('async'); // . var qHashFile = async.queue(function (args, cb) { // var oHash = crypto.createHash('md5'); // var rs = fs.createReadStream(args.filePath); // - , rs.on('error', args.callback); // rs.on('data', function (data) { oHash.update(data); }); // rs.on('end', function () { // args.callback(null,oHash.digest('base64').replace(/=/g,'')); // cb(); }); }, 16); // // function getAttrDir(dirPath,callback) { //console.log("getAttrDir",dirPath); // fs.readdir(dirPath,function(err,items) { // , if (err) return callback(err); // var ret={ size : 0, // items:{} // }; var hashs=[]; // async.each(items, function(itemName,cb){ // getAttrItem(path.join(dirPath,itemName),function(err,attr){ // , if (err) return callback(err); // ret.size += attr.size; // ret.items[itemName] = attr; // hashs.push(attr.hash); // cb(); }); }, function(err) { // , if (err) return callback(err); // , // hashs.sort(); var oHash = crypto.createHash('md5'); hashs.forEach(function(hash) { oHash.update(hash); }); // ret.hash = oHash.digest('base64').replace(/=/g,''); // //console.log("getHashFile",dirPath,ret); callback(null,ret); }); }); } // function getAttrItem(itemPath,callback) { // fs.stat(itemPath, function(err,stat) { // , if (err) return callback(err); // if( stat.isDirectory() ) { // getAttrDir(itemPath,callback); } else { // qHashFile.push( { filePath : itemPath, callback : function(err,hash) { // callback(err,{ size : stat.size, // hash : hash, // mtime : stat.mtime.toISOString() // }); } }, function(err){ // , if(err) return callback(err); }); } }); } // module.exports = getAttrItem;
// var oHash = crypto.createHash('md5'); // var rs = fs.createReadStream(args.filePath); // - , rs.on('error', args.callback); // rs.on('data', function (data) { oHash.update(data); }); // rs.on('end', function () { // args.callback(null,oHash.digest('base64').replace(/=/g,'')); // cb(); });
Always won the option:
// var oHash = crypto.createHash('md5'); oHash.setEncoding('base64'); // var rs = fs.createReadStream(args.filePath); // rs.on('end', function() { // oHash.end(); // args.callback(null,oHash.read().replace(/=/g,'')); // cb(); }); // rs.pipe(oHash);
events.js:72 throw er; // Unhandled 'error' event ^ Error: EMFILE, open '<- >'
Source: https://habr.com/ru/post/244223/