nodejs解压缩zip文件:adm-zip

本文介绍adm-zip的常用功能,如解压缩、压缩文件及文件夹,并提供了解压缩时中文文件名乱码的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【简介】

包名: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个未解问题,其中中文文件名乱码算是硬伤~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uikoo9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值