我有一个运行了几天的节点脚本,直到完成为止。
在运行过程中,该脚本使用以下功能创建和处理许多文件:
fs.writeFileSync
fs.appendFileSync
我应该注意,文件操作不是脚本中的瓶颈,因此在这里故意使用那些“ sync”方法。
在长时间执行此脚本的某个随机时刻,它引发以下异常:
Error: (node:13308) UnhandledPromiseRejectionWarning: Error: EBUSY: resource busy or locked, open '...'
at Object.openSync (fs.js:443:3)
at Object.writeFileSync (fs.js:1194:35)
at Object.appendFileSync (fs.js:1240:6)
我很确定这是其他Windows进程“抢占”该文件的结果(而不是我的代码出现问题,因为脚本有时会成功完成)是错误的。
假设情况确实如此,并且其他进程很快就会“放行”文件,我已决定解决此问题的方法如下:
首先,我将const fs = require("fs");
替换为const fs = require("./fs");
。
然后,我添加了文件fs.js
:
const fs = require("fs");
for (const funcName of ["writeFileSync", "appendFileSync"]) {
module.exports[funcName] = function(fileName, ...args) {
while (true) {
try {
return fs[funcName](fileName, ...args);
}
catch (error) {
console.log(error.message);
}
}
};
}
我已验证此代码有效。
但是,我真的不愿意使用此修补程序,因为它不适合您做。
您会不会对如何解决这个问题有任何建议?
我的操作系统是Windows 10。
非常感谢您!