【JS代码提高--002】:JavaScript中如何通过MD5sum检查文件的完整性

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);
    });
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木瓜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值