JS中如何通过MD5sum检查文件的完整性
function findMatchingIntegralFile(fileToMatch/*: Object*/, filesToCheck/*: Array<Object>*/)/*: Promise*/ {
var matchingFileIndex = _.findIndex(filesToCheck, function(fileToCheck) {
return fileToMatch.md5sum === fileToCheck.md5sum;
});
if (matchingFileIndex === -1) {
// This is NOT error situation, if no matching file is found, just return undefined
return Promise.resolve(undefined);
}
var matchedFile = filesToCheck[matchingFileIndex];
return module.exports.checkFileIntegrity(matchedFile, fileToMatch.md5sum)
.then(function(isIntegral) {
return isIntegral ? matchedFile : findMatchingIntegralFile(fileToMatch, filesToCheck.slice(matchingFileIndex + 1));
});
}
function checkFileIntegrity(fsFile/*: Object*/, expectedChecksum/*: string*/)/*: Promise*/ {
return calculateMd5(fsFile.path)
.then(function(calculatedChecksum) {
return calculatedChecksum === expectedChecksum;
})
.catch(function(err) {
// if calculateMd5Sum throws then assume that file is not integral
logger.warn("Checksum for file " + fsFile.path + " could not be calculated, reason: " + err.stack);
return false;
});
}
function calculateMd5(path/*: string*/)/*: Promise*/ {
var md5Pattern = /^[a-fA-F0-9]{32}$/;
var command = "md5sum " + path;
return osAccessHub.runProcess(command)
.then(function(result) {
var sum = result[0].split(" ")[0];
if (!sum && md5Pattern.test(sum)) {
throw new Error("calculateMd5Sum: Received wrong output from command: " + command);
}
return sum;
});
}
//osAccessHub contents like this
var cp = require("child_process");
var Promise = require("bluebird");
var logger = require("@****/logger").forPackage("PROCESS");
function executeProcess(command, options, resolve, reject) {
logger.info("executing command: " + command + " with options: " + options);
return cp.exec(command, options, function(err, stdout, stderr) {
if (err) {
logger.warn(command + " failed with error: " + err);
reject(err);
} else {
logger.info(command + " succeeded with stdout: \"" + stdout + "\" and stderr: \"" + stderr + "\"");
resolve([stdout, stderr]);
}
}).on("error", function(err) {
logger.warn(command + " emitted error: " + err);
reject(err);
});
}
exports.runProcess = Promise.method(function(command, options) {
return new Promise(function(resolve, reject) {
executeProcess(command, options, resolve, reject);
});
});