all files / dir-compare/ filecompare.js

92.31% Statements 60/65
65.38% Branches 17/26
90% Functions 9/10
92.31% Lines 60/65
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110                                                                                                    
var fs = require('fs');
var bufferEqual = require('buffer-equal');
var Promise = require('bluebird');
var FileDescriptorQueue = require('./fileDescriptorQueue');
var fdQueue = new FileDescriptorQueue(8);
/**
 * Compares two partial buffers.
 */
var compareBuffers = function(buf1, buf2, contentSize, allocatedSize){
    Iif(contentSize===allocatedSize){
        return bufferEqual(buf1, buf2);
    } else{
        return bufferEqual(buf1.slice(0, contentSize), buf2.slice(0, contentSize));
    }
}
 
/**
 * Compares two files by content using bufSize as buffer length.
 */
var compareSync = function (path1, path2, bufSize) {
	bufSize = bufSize ? bufSize : 4096;
    var fd1, fd2;
    try {
        fd1 = fs.openSync(path1, 'r');
        fd2 = fs.openSync(path2, 'r');
        var buf1 = new Buffer(bufSize);
        var buf2 = new Buffer(bufSize);
        var progress = 0;
        while (true) {
            var size1 = fs.readSync(fd1, buf1, 0, bufSize, null);
            var size2 = fs.readSync(fd2, buf2, 0, bufSize, null);
            Iif (size1 !== size2) {
                return false;
            } else if (size1 === 0) {
                // End of file reached
                return true;
            } else if (!compareBuffers(buf1, buf2, size1, bufSize)) {
                return false;
            }
        }
    } finally {
        closeFilesSync(fd1, fd2);
    }
};
 
var wrapper = {
        open : Promise.promisify(fdQueue.open),
        read : Promise.promisify(fs.read),
};
 
/**
 * Compares two files by content using bufSize as buffer length.
 */
var compareAsync = function (path1, path2, bufSize) {
    bufSize = bufSize ? bufSize : 4096;
    var fd1, fd2;
    return Promise.all([wrapper.open(path1, 'r'), wrapper.open(path2, 'r')]).then(function (fds) {
        fd1 = fds[0];
        fd2 = fds[1];
        var buf1 = new Buffer(bufSize);
        var buf2 = new Buffer(bufSize);
        var progress = 0;
        var compareAsyncInternal = function () {
            return Promise.all([
                    wrapper.read(fd1, buf1, 0, bufSize, null), wrapper.read(fd2, buf2, 0, bufSize, null)
            ]).then(function (bufferSizes) {
                var size1 = bufferSizes[0];
                var size2 = bufferSizes[1];
                Iif (size1 !== size2) {
                    return false;
                } else if (size1 === 0) {
                    // End of file reached
                    return true;
                } else if (!compareBuffers(buf1, buf2, size1, bufSize)) {
                    return false;
                } else {
                    return compareAsyncInternal();
                }
            });
        };
        return compareAsyncInternal().then(function (result) {
            closeFilesAsync(fd1, fd2);
            return result;
        });
    }).catch(function (error) {
        closeFilesAsync(fd1, fd2);
        return error;
    });
};
 
var closeFilesSync = function(fd1, fd2){
    Eif (fd1) {
        fs.closeSync(fd1);
    }
    Eif (fd2) {
        fs.closeSync(fd2);
    }
}
var closeFilesAsync = function(fd1, fd2){
    Eif (fd1) {
        fdQueue.close(fd1);
    }
    Eif (fd2) {
    	fdQueue.close(fd2);
    }
}
module.exports = {
    compareSync : compareSync,
    compareAsync : compareAsync
};