Node.js 拷贝大文件
2019-03-17 本文已影响0人
Kenny锅
大家一谈到 Node.js,首先提到的就是 Chrome V8 引擎多厉害,不可否认 V8 在内存管理等方面作用非常大。但其实还有一个非常牛的技术常常被大家忽略了,那就是 libuv。
那么 libuv
是什么呢?
libuv is a multi-platform support library with a focus on asynchronous I/O.
libuv
是一个跨平台操作异步I/O的库,Node.js 之所以擅长文件操作,也是大量使用这个技术。不单单是文件操作,Node.js 其他所有无阻塞异步操作都是用的它。
下面我们来展示一下拷贝1G大小文件怎么写,如码所示:
const fs = require('fs');
const path = require('path');
const sourceFile = path.join(__dirname, '../', 'indiv18.zip');
const destFile = path.join(__dirname, 'indiv18.zip');
console.time('copying');
fs.stat(sourceFile, (err, stat) => {
const fileSize = stat.size;
let bytesCopied = 0;
const readStream = fs.createReadStream(sourceFile);
readStream.on('data', (buffer) => {
bytesCopied += buffer.length;
const porcentage = ((bytesCopied / fileSize) * 100).toFixed(3);
console.log(porcentage + '%');
});
readStream.on('end', () => {
console.timeEnd('copying');
});
readStream.pipe(fs.createWriteStream(destFile));
});
用一句话来解释上述代码:将文件以流的形式读取,通过管道传给写文件流的函数,从而实现文件拷贝。
1.032%
1.894%
...
99.997%
100.000%
copying: 3098.074ms
你没有看错,只用了 3 秒。如果把输出进度那个功能去掉,大约是 1 秒多点。
其实我不是在说 Node.js 多好,而是想告诉大家用固态硬盘
有多爽,哈哈!