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 => {









