【简介】
包名:adm-zip
版本:0.4.13
依赖包数:0个
周下载量:118w
未解问题:118个
最后更新:3个月前
【总结】
1.同时支持压缩和解压缩
2.下载量大,0依赖于其他包
3.文档较弱,未解问题比较多
4.中文文件名乱码
建议:只使用unzip相关方法(fix中文bug后)
【完整代码】
包括unzip方法,zipFile方法,zipFolder方法等
var admZip = require('adm-zip');
var iconv = require('iconv-lite');
/**
* unzip
* zipFile,待解压缩的zip文件
* destFolder,解压缩后存放的文件夹
*/
function unzip(zipFile, destFolder){
var zip = new admZip(zipFile);
var zipEntries = zip.getEntries();
for(var i=0; i<zipEntries.length; i++){
var entry = zipEntries[i];
entry.entryName = iconv.decode(entry.rawEntryName, 'gbk');
}
zip.extractAllTo(destFolder, true);
}
/**
* zip file
* sourceFile,待压缩的文件
* destZip,压缩后的zip文件
*/
function zipFile(sourceFile, destZip){
var zip = new admZip();
zip.addLocalFile(sourceFile);
zip.writeZip(destZip);
}
/**
* zip folder
* sourceFolder,待压缩的文件夹
* destZip,压缩后的zip文件
*/
function zipFolder(sourceFolder, destZip){
var zip = new admZip();
zip.addLocalFolder(sourceFolder);
zip.writeZip(destZip);
}
【unzip】
首先准备一个zip包,里面有一个test.js文件,如下
使用如下代码解压缩:
var admZip = require('adm-zip');
/**
* unzip
* zipFile,待解压缩的zip文件
* destFolder,解压缩后存放的文件夹
*/
function unzip(zipFile, destFolder){
var zip = new admZip(zipFile);
zip.extractAllTo(destFolder, true);
}
/**
* test
*/
function test(){
var zipFile = 'd:/zip/demo02/test.zip';
var destFolder = 'd:/zip/demo02';
unzip(zipFile, destFolder);
}
test();
解压缩正常
【unzip-中文乱码】
但是当zip中的文件名包含中文的时候就有问题,解压缩后文件名为乱码
找一个带有中文文件名的文件压缩为zip,使用之前代码解压缩
解压缩后的文件为乱码
查找了官方github上的issues,提这个问题的比较多,然而遗憾的是官方并没有fix,只是有人提供的解决方法,详见:https://github.com/cthackers/adm-zip/issues/75
按以上方法修改代码后,用以下代码解压缩,
var admZip = require('adm-zip');
var iconv = require('iconv-lite');
/**
* unzip
* zipFile,待解压缩的zip文件
* destFolder,解压缩后存放的文件夹
*/
function unzip(zipFile, destFolder){
var zip = new admZip(zipFile);
var zipEntries = zip.getEntries();
for(var i=0; i<zipEntries.length; i ++){
var entry = zipEntries[i];
entry.entryName = iconv.decode(entry.rawEntryName, 'gbk');
}
zip.extractAllTo(destFolder, true);
}
/**
* test
*/
function test(){
var zipFile = 'd:/zip/demo01/demo01.zip';
var destFolder = 'd:/zip/demo01';
unzip(zipFile, destFolder);
}
test();
使用该代码解压缩后,文件名正确无乱码
但是这个fix方法需要引入一个新包iconv-lite,而且只能解决解压缩的中文文件名乱码问题,压缩时中文文件名还是有乱码。
【zip file】
首先准备一个test.js文件,使用如下代码压缩
var admZip = require('adm-zip');
/**
* zip file
* sourceFile,待压缩的文件
* destZip,压缩后的zip文件
*/
function zipFile(sourceFile, destZip){
var zip = new admZip();
zip.addLocalFile(sourceFile);
zip.writeZip(destZip);
}
/**
* test
*/
function test(){
var sourceFile = 'd:/zip/demo03/test.js';
var destZip = 'd:/zip/demo03/test.zip';
zipFile(sourceFile, destZip);
}
test();
压缩文件正常
但是如果文件名中带中文,例如test-你好.js压缩后是乱码,如下
【zip folder】
准备一个有多层级,多文件的文件夹,如下
使用如下代码压缩这个文件,
var admZip = require('adm-zip');
/**
* zip folder
* sourceFolder,待压缩的文件夹
* destZip,压缩后的zip文件
*/
function zipFolder(sourceFolder, destZip){
var zip = new admZip();
zip.addLocalFolder(sourceFolder);
zip.writeZip(destZip);
}
/**
* test
*/
function test(){
var sourceFolder = 'd:/zip/demo04/test';
var destZip = 'd:/zip/demo04/test.zip';
zipFolder(sourceFolder, destZip);
}
test();
压缩文件夹正常
中文乱码问题,同上,如果文件夹中的文件名带有中文,压缩后是乱码,目前没有找到什么好的解决方案
【中文文档】
adm-zip自带文档排版混乱,而且没有中文版本,详见:https://github.com/cthackers/adm-zip/wiki/ADM-ZIP
翻译了一份中文文档,详见:https://github.com/insistime/qiao.plugin.zip/tree/master/test/adm-zip
【end】
1.介绍了adm-zip的常见使用方法unzip,zipFile,zipFolder
2.介绍了adm-zip解压缩时中文乱码的解决方法
3.nodejs下压缩和解压缩最终方案见后续文章
adm-zip是nodejs上同时支持压缩和解压缩为数不多的npm包,而且下载量大,方法简单易上手,奈何维护不积极,最后一次提交为3个月前,目前有118个未解问题,其中中文文件名乱码算是硬伤~