Node.js解压文件时遇‘end of central directory not found’错误求助
解决Node.js解压zip时出现‘end of central directory not found’的问题
这个错误本质是你要解压的test.zip文件无效或不完整,结合你的代码,主要问题和修复方案如下:
核心问题分析
- 异步操作未正确等待:调用
writeDir.writeFile(mergeBuffer)后立即执行解压,但文件写入是异步操作,此时test.zip可能还没完全写入磁盘,导致解压时读取到不完整的文件。 - 回调参数错误:
compressing.zip.uncompress的.then('uncompressDone')和.catch('handleError')传的是字符串而非实际回调函数,会导致后续逻辑失效,也无法正确捕获错误细节。 - zip文件生成异常:合并后的
mergeBuffer可能不是有效的zip格式,或者readBufferDir读取的文件片段本身有问题,导致生成的test.zip损坏。
修复步骤
1. 修正异步流程,等待文件写入完成
确保文件完全写入后再执行解压操作,给writeFile加上await(若它返回Promise),同时用try/catch处理解压逻辑:
async uplaodFolder() { await fs.mkdir(`${path.join(basePath, 'extract')}`, {recursive:true}).catch(err => { console.error(err); }); const bufferChunks = await this.readBufferDir(`${path.join(basePath, '/ldpi')}`); var mergeBuffer = Buffer.concat(bufferChunks); // 等待文件写入完成,捕获写入错误 await writeDir.writeFile(mergeBuffer).catch(err => { console.error('写入zip文件失败:', err); return; // 写入失败直接终止后续操作 }); // 用try/catch处理解压,替代字符串形式的then/catch try { await compressing.zip.uncompress(path.join(basePath, 'test.zip'), path.join(basePath, '/extract')); console.log('uncompressDone'); } catch (err) { console.error('解压错误:', err); // 在这里实现handleError的逻辑 } }
2. 验证生成的zip文件有效性
运行代码后找到basePath下的test.zip,用系统自带解压工具尝试打开:
- 若无法打开,说明
readBufferDir读取的不是zip文件的正确片段,或Buffer.concat后的结果无效,需要排查readBufferDir的实现逻辑。
3. 确认文件路径正确性
检查path.join(basePath, 'test.zip')是否指向刚写入的文件,避免路径错误导致读取到旧的损坏文件。
内容的提问来源于stack exchange,提问作者umer
相关产品推荐
相关产品推荐

