nodejs文件压缩与解压
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!