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 | 1×
1×
1×
1×
1×
1×
6×
6×
1×
4×
4×
4×
4×
4×
4×
4×
4×
4×
6×
6×
6×
6×
3×
3×
1×
4×
1×
1×
4×
4×
4×
4×
4×
4×
4×
4×
4×
6×
6×
6×
6×
6×
3×
3×
1×
2×
4×
4×
4×
1×
4×
4×
4×
4×
1×
4×
4×
4×
4×
1×
| 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
}; |