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

使用node-stream-zip解压Zip文件时出现Bad file descriptor错误求助

解决node-stream-zip提取文件时的"Bad file descriptor, read"错误

这个错误我之前也碰到过,核心问题是异步操作的顺序不对:你调用的zip.extract()是异步方法,但紧接着就执行了zip.close(),导致提取过程还在进行时,Zip文件已经被关闭,自然会抛出文件描述符相关的错误。

另外,你的代码还没实现"优先提取电子表格,失败则提取全部"的需求,我一起帮你修正:

修正后的完整代码

const StreamZip = require('node-stream-zip');
const fs = require('fs');
const path = require('path');

const zip = new StreamZip({ 
  file: path.join(downloadsDir, fileToFind), 
  storeEntries: true 
});

zip.on('ready', () => {
  // 确保提取目录存在
  if (!fs.existsSync('extracted')) {
    fs.mkdirSync('extracted');
  }

  // 第一步:尝试单独提取电子表格文件
  zip.extract('1234/data.xlsx', './extracted/data.xlsx', (extractErr) => {
    if (extractErr) {
      // 提取电子表格失败,转而提取整个1234目录
      console.log('提取电子表格失败,将提取全部文件:', extractErr.message);
      zip.extract('1234/', './extracted', (fullExtractErr) => {
        if (fullExtractErr) {
          console.log('提取全部文件失败:', fullExtractErr.message);
        } else {
          console.log('全部文件提取完成');
        }
        // 无论成功失败,提取完成后再关闭Zip
        zip.close();
      });
    } else {
      console.log('电子表格提取完成');
      // 提取成功后关闭Zip
      zip.close();
    }
  });
});

// 监听Zip实例的全局错误,捕获初始化或处理中的异常
zip.on('error', (err) => {
  console.log('Zip文件处理出错:', err.message);
});

关键修改说明

  • 调整异步流程:把zip.close()移到所有提取操作的回调函数内,确保只有在提取任务完全结束(成功或失败)后才关闭Zip文件,避免异步冲突。
  • 实现需求逻辑:先尝试单独提取data.xlsx,如果失败(比如文件不存在、提取出错),再自动降级提取整个1234/目录。
  • 添加全局错误监听:通过zip.on('error')捕获Zip文件初始化或处理过程中的其他异常,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:38:45