基于Node.js实现压缩和解压缩的方法

2020-06-17 07:00:33易采站长站整理

console.error(err);
});

结合 async/await 的编程模型,代码写起来会更加容易阅读:


const compressing = require('compressing');

async function main() {
try {
await compressing.tar.compressDir('nodejs-compressing-demo',
'nodejs-compressing-demo.tar');
await compressing.gzip.compressFile('nodejs-compressing-demo.tar',
'nodejs-compressing-demo.tgz');
console.log('success');
} catch (err) {
console.error(err);
}

// 解压缩
try {
await compressing.gzip.uncompress('nodejs-compressing-demo.tgz',
'nodejs-compressing-demo.tar');
await compressing.tar.uncompress('nodejs-compressing-demo.tar',
'nodejs-compressing-demo2');
console.log('success');
} catch (err) {
console.error(err);
}
}

main();

Stream 接口

通过 compressing.tar.Stream 类,可以动态添加任意文件、文件夹到一个 tar stream 对象中,非常灵活。


const tarStream = new compressing.tar.Stream();
// dir
tarStream.addEntry('dir/path/to/compress');
// file
tarStream.addEntry('file/path/to/compress');
// buffer
tarStream.addEntry(buffer);
// stream
tarStream.addEntry(stream);

const destStream = fs.createWriteStream('path/to/destination.tgz');
pump(tarStream, new compressing.gzip.FileStream(), destStream, err => {
if (err) {
console.error(err);
} else {
console.log('success');
}
});

zip

zip 其实可以看作是 tar + gzip 的「商业化」结合,它让使用者不需要区分是压缩文件还是压缩文件夹,反正用我 zip 就对了。

使用 zip 命令行工具压缩一个文件夹的例子:


$ zip -r nodejs-compressing-demo.zip nodejs-compressing-demo/
adding: nodejs-compressing-demo/ (stored 0%)
adding: nodejs-compressing-demo/test/ (stored 0%)
...
adding: nodejs-compressing-demo/.travis.yml (deflated 36%)

$ ls -l nodejs-compressing-demo.*
-rw-r--r-- 1 a a 206336 Feb 12 14:06 nodejs-compressing-demo.tar
-rw-r--r-- 1 a a 39808 Feb 12 14:07 nodejs-compressing-demo.tgz
-rw-r--r-- 1 a a 55484 Feb 12 14:34 nodejs-compressing-demo.zip

通过 tgz 和 zip 文件大小对比,可以看出默认的压缩参数下,gzip 的效果会比 zip 好。

Node.js 实现 zip

实现代码跟 tar 类似,只不过默认是压缩的,不需要再添加 gzip 的过程。


const compressing = require('compressing');

compressing.zip.compressDir('nodejs-compressing-demo', 'nodejs-compressing-demo.zip')
.then(() => {
console.log('success');
})
.catch(err => {