如何检查两个文件是否具有相同的内容
How to check if two files have the same content?
我正在使用mocha/supertest/should.js
测试REST服务
GET /files/<hash>
将文件作为流返回。
如何在should.js
中断言文件内容相同?
it('should return file as stream', function (done) {
var writeStream = fs.createWriteStream('test/fixtures/tmp.json');
var req = api.get('/files/676dfg1430af3595');
req.on('end', function(){
var tmpBuf = fs.readFileSync('test/fixtures/tmp.json');
var testBuf = fs.readFileSync('test/fixtures/test.json');
// How to assert with should.js file contents are the same (tmpBuf == testBuf )
// ...
done();
});
});
令人惊讶的是,没有人建议使用Buffer.equals。这似乎是最快、最简单的方法,自v0.11以来就一直存在。
因此,您的代码将变成tmpBuf.equals(testBuf)
您有3个解决方案:
第一个:
比较结果字符串
tmpBuf.toString() === testBuf.toString();
第二:
使用循环逐字节读取缓冲区
var index = 0,
length = tmpBuf.length,
match = true;
while (index < length) {
if (tmpBuf[index] === testBuf[index]) {
index++;
} else {
match = false;
break;
}
}
match; // true -> contents are the same, false -> otherwise
第三:
使用第三方模块,如buffertools和buffertools.compare(buffer,buffer|string)方法。
在should.js
中,您可以使用.eql
来比较Buffer的实例:
> var buf1 = new Buffer('abc');
undefined
> var buf2 = new Buffer('abc');
undefined
> var buf3 = new Buffer('dsfg');
undefined
> buf1.should.be.eql(buf1)
...
> buf1.should.be.eql(buf2)
...
> buf1.should.be.eql(buf3)
AssertionError: expected <Buffer 61 62 63> to equal <Buffer 64 73 66 67>
...
>
用于比较大文件,例如断言文件上载时的图像。缓冲区或字符串与should.eql
的比较需要很长时间。我建议使用crypto模块断言缓冲区哈希:
const buf1Hash = crypto.createHash('sha256').update(buf1).digest();
const buf2Hash = crypto.createHash('sha256').update(buf2).digest();
buf1Hash.should.eql(buf2Hash);
一种更简单的方法是断言缓冲区长度,如下所示:
buf1.length.should.eql(buf2.length)
不使用shouldjs作为断言模块,您当然可以使用不同的工具
使用file-compare
和node-temp
的解决方案:
it('should return test2.json as a stream', function (done) {
var writeStream = temp.createWriteStream();
temp.track();
var req = api.get('/files/7386afde8992');
req.on('end', function() {
comparator.compare(writeStream.path, TEST2_JSON_FILE, function(result, err) {
if (err) {
return done(err);
}
result.should.true;
done();
});
});
req.pipe(writeStream);
});
我认为应该在JavaScript中使用非阻塞调用来获得更好的性能,至少可以防止阻塞其他操作:
阻塞是指Node.js进程中附加JavaScript的执行必须等待非JavaScript操作完成。发生这种情况是因为在发生阻塞操作时,事件循环无法继续运行JavaScript。
在Node.js中,JavaScript由于占用CPU而不是等待非JavaScript操作(如I/O)而表现出较差的性能,通常不被称为阻塞。Node.js标准库中使用libuv的同步方法是最常用的阻塞操作。本机模块也可能具有阻塞方法。
因此,我将使用以下代码来更改Sync
调用。此外,我将使用Max
建议的方法equals
来比较两个文件:
const fs = require('fs')
fs.readFile('file1', (err, data1) => {
if (err) throw err;
fs.readFile('file2', (err, data2) => {
if (err) throw err;
if (data1.equals(data2)) {
console.log('EQUAL')
} else {
console.log('NON EQUAL')
}
});
});
尽管对于一个小脚本和一个单独的脚本,结果几乎是相同的
- javascript测试是否存在两个标志中的任何一个
- 检查来自不同数组的两个元素的一个属性是否相等
- 如何检查两个字符串是否具有相同的字符,包括特殊字符
- JavaScript:检查变量是否等于两个或多个值之一的简单方法
- Javascript如何确定两个对象是否相同
- 测试两个版本的 json 架构是否向后兼容
- 测试两个变量是否包含一些数据 JavaScript
- 检查两个或多个 DOM 元素是否重叠
- Javascript-如何验证两个电话号码是否不同
- 使用WebRTC对等连接进行两个以上参与者的视频会议是否可行
- 异步函数调用是否可以在两个同步语句之间完成
- 是否存在添加两个相同事件处理程序的默认行为
- 找出LngLat点是否在另外两个点之间
- 是否有任何功能可以合并两个JSON数据集并替换旧信息?(节点.JS)
- 检查qunit中是否有两个异步调用
- 确定两个HTML元素在没有ID的情况下是否不同
- 函数来检查给定整数数组中给定位置的元素是否大于其两个邻域
- 如何确定两个凹/凸形状是否处于特定距离
- 如何确定数组中的值是否位于两个附加数组的所有并行索引的值之间
- 当有两个浏览器实例时,如何检查浏览器会话是否存在