Node.js 使用 adm-zip 操作 ZIP 文件指南

1. 安装依赖

在项目中安装 adm-zip 包:

python 复制代码
bash
npm install adm-zip

2. 初始化对象

引入模块后,根据需求选择不同的初始化方式:

javascript 复制代码
typescript
var AdmZip = require('adm-zip')

// 读取现有 ZIP 文件
var zip = new AdmZip('./my_file.zip')

// 创建新的 ZIP 对象(用于生成新压缩包)
var zipCreating = new AdmZip()
  • new AdmZip(path): 加载现有文件。
  • new AdmZip(): 创建空对象用于后续添加文件。

3. 核心功能 API

3.1 遍历文件列表

使用 getEntries 获取压缩包内所有条目,并通过 forEach 遍历。

javascript 复制代码
typescript
var zipEntries = zip.getEntries()

zipEntries.forEach(function (zipEntry) {
  console.log(zipEntry.toString())
  if (zipEntry.entryName == 'my_file.txt') {
    console.log(zipEntry.getData().toString('utf8'))
  }
})
  • getEntries(): 返回包含所有条目的数组。
  • zipEntry.entryName: 获取文件在压缩包内的路径。
  • zipEntry.isDirectory: 判断是否为目录。
  • zipEntry.getData(): 获取文件内容的 Buffer 数据。

3.2 读取文件内容

直接读取指定文件的文本内容。

arduino 复制代码
typescript
console.log(zip.readAsText('my_file.txt'))
  • readAsText(entryName): 将指定条目内容作为字符串返回。

3.3 提取单个文件

将压缩包内的特定文件提取到指定目录。

arduino 复制代码
typescript
zip.extractEntryTo(
  'my_file.txt',   // 条目名称
  './src',         // 目标路径
  false,           // maintainEntryPath: 是否保持条目路径结构
  true             // overwrite: 是否覆盖现有文件
)

maintainEntryPath 参数详解

说明 示例
true 保持压缩包内的完整路径结构 config/settings.json./src/config/settings.json
false 只提取文件,不保留目录结构 config/settings.json./src/settings.json

场景对比:

假设 ZIP 内有 config/settings.json 文件:

arduino 复制代码
typescript
// 不保持路径
zip.extractEntryTo('config/settings.json', './src', false, true)
// 结果:./src/settings.json

// 保持路径
zip.extractEntryTo('config/settings.json', './src', true, true)
// 结果:./src/config/settings.json

选择建议:

场景 推荐值
只想提取单个文件,不关心目录 false
需要保持项目原有结构 true
批量解压多个相关文件 true
扁平化输出所有文件 false

3.4 解压所有文件

将整个压缩包内容一次性解压到指定目录。

arduino 复制代码
typescript
zip.extractAllTo('./src', true)
  • extractAllTo(targetPath, overwrite): 批量解压操作。

3.5 创建并写入 ZIP 文件

AdmZip 实例添加文件内容,并保存为新的 .zip 文件。

csharp 复制代码
typescript
var content = 'inner content of the file'
// 添加文件:文件名,内容 Buffer,注释
zip.addFile('test.txt', Buffer.from(content, 'utf8'), 'entry comment goes here')
// 写入磁盘
zip.writeZip('./test.zip')
  • addFile(name, content, comment): 向压缩包添加新条目。
  • Buffer.from(): 将字符串转换为 Buffer 流。
  • writeZip(path): 将内存中的 ZIP 对象保存为物理文件。

4. 方法参数速查表

方法 参数 1 参数 2 参数 3 参数 4
extractEntryTo entryName targetPath maintainEntryPath overwrite
extractAllTo targetPath overwrite - -
addFile name content comment -

5. 注意事项

  • 路径存在性: 确保解压或写入的目标目录存在,否则可能报错。
  • 字符编码 : 处理中文文件名或内容时,注意指定编码(如 utf8)。
  • 密码支持 : 代码中定义了 password 变量,若需加密压缩包,需查阅 adm-zip 关于密码保护的具体 API 支持。
相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端