You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS多文件夹异步跨平台压缩实现方案求助

Node.js 实现跨平台多文件夹异步压缩方案

推荐方案:使用 archiver 库

archiver 是Node.js生态中成熟的异步压缩工具库,原生兼容Linux和Windows系统,完美解决adm-zip仅支持同步操作的限制,支持多文件夹的批量异步压缩需求。

步骤1:安装依赖

npm install archiver

步骤2:异步压缩实现代码

以下是两种常见场景的完整实现:

场景1:多个文件夹分别生成独立压缩包

const fs = require('fs').promises;
const path = require('path');
const archiver = require('archiver');

// 待压缩的文件夹列表
const targetFolders = [
  './docs',
  './assets',
  './logs'
];

// 单个文件夹的异步压缩函数
async function zipFolder(folderPath) {
  const zipName = `${path.basename(folderPath)}.zip`;
  const outputStream = fs.createWriteStream(zipName);
  const archive = archiver('zip', { zlib: { level: 9 } }); // 启用最高压缩级别

  return new Promise((resolve, reject) => {
    // 监听流完成与错误事件
    outputStream.on('close', () => resolve(`压缩完成:${zipName},总大小 ${archive.pointer()} 字节`));
    archive.on('error', (err) => reject(err));

    // 启动压缩流程
    archive.pipe(outputStream);
    archive.directory(folderPath, false); // false表示将文件夹内容直接放入压缩包,不保留外层文件夹
    archive.finalize();
  });
}

// 批量异步压缩多文件夹
async function batchZip() {
  try {
    // 用Promise.all实现并发异步处理
    const results = await Promise.all(targetFolders.map(folder => zipFolder(folder)));
    results.forEach(res => console.log(res));
  } catch (err) {
    console.error('压缩失败:', err);
  }
}

// 执行批量压缩
batchZip();

场景2:将多个文件夹合并到同一个压缩包

const fs = require('fs').promises;
const archiver = require('archiver');

async function zipFoldersIntoSingleArchive() {
  const outputStream = fs.createWriteStream('all_folders.zip');
  const archive = archiver('zip', { zlib: { level: 6 } }); // 平衡压缩速度与压缩率

  return new Promise((resolve, reject) => {
    outputStream.on('close', () => resolve(`合并压缩完成,总大小 ${archive.pointer()} 字节`));
    archive.on('error', (err) => reject(err));

    archive.pipe(outputStream);
    // 添加多个文件夹,并指定它们在压缩包内的路径
    archive.directory('./docs', 'documents');
    archive.directory('./assets', 'static_resources');
    archive.finalize();
  });
}

// 执行合并压缩
zipFoldersIntoSingleArchive()
  .then(msg => console.log(msg))
  .catch(err => console.error(err));

为什么选择archiver?

  • 完全异步:基于Node.js流API,不会阻塞事件循环,适合批量处理任务
  • 跨平台兼容:内部处理了Linux和Windows的文件系统差异,无需手动适配
  • 格式灵活:支持ZIP、TAR等多种压缩格式,可通过参数快速切换
  • 配置丰富:支持自定义压缩级别、文件过滤、压缩包内路径映射等功能

备选方案:调用系统原生命令(不推荐)

如果不想依赖第三方库,可通过child_process异步调用系统压缩命令,但需手动处理跨平台差异:

  • Linux:使用zip或tar命令
  • Windows 10+:使用系统自带的tar命令

示例代码:

const { exec } = require('child_process');
const path = require('path');

async function zipWithSystemCmd(folderPath) {
  const zipName = `${path.basename(folderPath)}.zip`;
  let cmd;

  // 根据系统选择对应命令
  if (process.platform === 'win32') {
    cmd = `tar -a -cf ${zipName} ${folderPath}`;
  } else {
    cmd = `zip -r ${zipName} ${folderPath}`;
  }

  return new Promise((resolve, reject) => {
    exec(cmd, (err, stdout, stderr) => {
      if (err) return reject(stderr);
      resolve(`系统命令压缩完成:${zipName}`);
    });
  });
}

// 批量处理示例
Promise.all([zipWithSystemCmd('./docs'), zipWithSystemCmd('./assets')])
  .then(results => console.log(results))
  .catch(err => console.error(err));

注意:该方案依赖系统环境,Windows 10以下版本可能没有自带tar命令,需额外安装工具,稳定性不如archiver。

内容的提问来源于stack exchange,提问作者DarkZeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:16:05