fsWriteFile无法写入文件求助:npm pack本地测试文件写入异常
解决npm pack测试时fs.writeFile无法写入output文件夹的问题
我在算法中实现了文件写入功能,终端能正常打印生成的数据,但调用fs.writeFile将数据写入同目录output文件夹的txt文件时失败。目前用npm pack本地测试包,其他功能都正常,只有文件写入不工作。相关代码如下:
const outputName = `dominion_output_${date.toDateString()}-${date.toLocaleTimeString()}.txt`; const outputPath = path.join(__dirname, "output", outputName); const data = `${intrPrint}${resultPrint}${customPrint}${existingPrint}${shotPrint}${totalShotPrint}${lengthPrint}${shotParaPrint}${depthParaPrint}${postPrint}`; fs.writeFile(outputPath, data, err => { if (err) { console.error(err); } else { console.log( `Data has been written to ${outputName}.\nPlease check the 'output' folder within the q3dominion directory.\n` )}; }); }; module.exports = dominion;
排查方向与解决方案
确保output目录存在
fs.writeFile不会自动创建不存在的目录,如果output文件夹没创建,写入直接失败。加一段代码递归创建目录,已存在也不会报错:const outputDir = path.join(__dirname, "output"); // 递归创建目录,{ recursive: true }允许创建多级目录 fs.mkdirSync(outputDir, { recursive: true }); const timeStr = date.toLocaleTimeString().replace(/:/g, "-"); const outputName = `dominion_output_${date.toDateString()}-${timeStr}.txt`; const outputPath = path.join(outputDir, outputName);修正路径指向问题
用npm pack安装包后,__dirname指向的是包在node_modules里的路径,不是用户项目的当前目录。如果想让文件写入用户项目根目录的output文件夹,换成process.cwd()(当前工作目录):const outputDir = path.join(process.cwd(), "output"); fs.mkdirSync(outputDir, { recursive: true }); const timeStr = date.toLocaleTimeString().replace(/:/g, "-"); const outputName = `dominion_output_${date.toDateString()}-${timeStr}.txt`; const outputPath = path.join(outputDir, outputName);处理文件名非法字符
date.toLocaleTimeString()生成的时间带冒号(比如14:35:20),Windows系统不允许文件名有冒号,直接导致写入失败。把冒号替换成横杠:const timeStr = date.toLocaleTimeString().replace(/:/g, "-"); const outputName = `dominion_output_${date.toDateString()}-${timeStr}.txt`;改用异步写法便于调试
原来的回调写法有时候可能因为异步顺序问题看不到错误,换成fs.promises.writeFile配合async/await,错误捕获更清晰:async function writeOutputFile() { try { const outputDir = path.join(process.cwd(), "output"); fs.mkdirSync(outputDir, { recursive: true }); const timeStr = date.toLocaleTimeString().replace(/:/g, "-"); const outputName = `dominion_output_${date.toDateString()}-${timeStr}.txt`; const outputPath = path.join(outputDir, outputName); await fs.promises.writeFile(outputPath, data); console.log(`Data has been written to ${outputName}.\nPlease check the 'output' folder.\n`); } catch (err) { console.error("文件写入失败:", err); } } writeOutputFile();
内容的提问来源于stack exchange,提问作者Jordy
相关产品推荐
相关产品推荐

