nodejs文件压缩与解压

nodejs现在常用比较靠谱的压缩与解压方式,archiver 与 unzip 结合。
archiver:https://github.com/ctalkington/node-archiver
unzip:https://github.com/EvanOxfeld/node-unzip

以下为基本使用:

文件压缩:

npm install archiver --save

var fs = require('fs')
var archiver = require('archiver')  // 压缩工具
// 注意fs.createWriteStream()会重写整个文件
// 压缩
// 定义输出文件路径及文件名
var output = fs.createWriteStream('./example.zip');
var archive = archiver('zip', {
    zlib: { level: 9 } // 设置压缩等级
});
// 压缩完毕的回调
output.on('close', function() {
  console.log(archive.pointer() + ' total bytes');
  console.log('压缩完毕');
});
// 监听警告
archive.on('warning', function(err) {
  if (err.code === 'ENOENT') {
      console.log('warning')
  } else {
      throw err;
  }
});
// 监听错误
archive.on('error', function(err) {
  throw err;
});
// 将解压数据添加到写入的文件
archive.pipe(output);
// 向archive添加需要压缩的文件
// 打开一个已有文件,并以特定文件名将打开内容保存到压缩文件
// var file1 = './zip/test1.txt';
// archive.append(fs.createReadStream(file1), { name: 'file1.txt' });
// 将字符串添加到压缩文件
// archive.append('这是字符串内容', { name: 'file2.txt' });
// 将缓冲区内容添加到压缩文件
// var buffer3 = Buffer.from('buff it!');
// archive.append(buffer3, { name: 'file3.txt' });
// 直接添加一个文件
// archive.file('./zip/test1.txt', { name: 'file4.txt' });
// 添加一个文件夹下所有内容到新命名的文件夹中压缩,注意不要添加输出文件夹,会有小问题
// archive.directory('./zip/', 'newdirc');
// 添加一个文件夹下所有内容到压缩文件的根目录
archive.directory('./zip/', false);
// 添加特定匹配模式的文件
// archive.glob('./zip/*.txt');
// 压缩完成
archive.finalize();

文件解压:

npm install unzip --save

var fs = require('fs')
var unzip = require('unzip') // 解压工具
// 直接解压
fs.createReadStream('./example.zip').pipe(unzip.Extract({ path: './unzip/' }));
// 可以自定义提取中的事件处理
// var extract = unzip.Extract({ path:  './unzip/' });  
// extract.on('error', function(err) {  
//     console.log("error++++++++++++++++++++++");  
//     console.log(err);  
//     //解压异常处理  
// });  
// extract.on('finish', function() {  
//     console.log("解压完成!!");  
//     //解压完成处理  
// });
// fs.createReadStream('./zip/test.zip').pipe(extract);  
// // 对每一个解压文件做处理
// fs.createReadStream('./zip/test.zip')
//   .pipe(unzip.Parse())
//   .on('entry', function(entry) { // 遍历每一个文件
//     var fileName = entry.path // 文件名
//     var type = entry.type // 'Directory' or 'File',表明解压的项是文件夹还是文件
//     var size = entry.size // 文件大小
//     if (fileName === "test1.txt") {
//       entry.pipe(fs.createWriteStream('./unzip/dest.txt')); // 读取test.txt中文件内容并copy到目标文件中
//     } else {
//       entry.autodrain();  // 关闭文件读取缓冲,释放内存。
//     }
//   });

以上两者可以结合起来用,比较靠谱。
美中不足的是unzip解压不能解压压缩文件中某个特定的文件,并且在linux环境下unzip去解压windows环境下的压缩包,会出现中文文件名乱码的情况。解决办法为将unzip的parse.js源码中用utf8对文件名解码转换为gbk文件名解码。

THE END!