使用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
相关产品推荐
相关产品推荐

