我有一个简单的过程,需要打开一个文件来读取,但如果文件不存在,它应该只是注意/忽略错误并继续。
我已经尝试了很多来源,但是找不到明确的例子,说明如何成功检查文件是否存在而没有节点进程抛出一个unaughtexception ENOENT。
一个简单的例子是:
fs.open('a.txt', 'r', function(err, fd) {
if(err) {
if(err.code === 'ENOENT' ){
console.log("Does not exist");
return;
}
throw err;
}
console.log(err.code);
})
答案 0 :(得分:0)
由于竞争条件,您不应在开放前检查是否存在文件,请参阅以下摘录自fs.exists()
文档。
在调用fs.open()之前,使用fs.exists()检查文件是否存在,建议不要使用fs.readFile()或fs.writeFile()。这样做会引入竞争条件,因为其他进程可能会更改两个调用之间的文件状态。相反,用户代码应直接打开/读取/写入文件,并在文件不存在时处理引发的错误。
Node.js
fs.exists()
文档:Source
如上所述,您应该只处理传递给fs.open()
回调函数的错误。 fs.open()
通过err
参数向您的回调返回错误,代码为ENOENT
,但不会导致UncaughtException
随后崩溃您的流程(假设您不是&# 39;在处理对象process.on('UncaughtException', err => {})
)上处理此问题。
您可能会在代码中使用错误或使用" throw"而不是"返回"描述如何将错误传递回代码时。除非UncaughtException
,否则上述示例代码不会导致err.code !== 'ENOENT'
。如果err.code !== 'ENOENT'
导致err
在没有包装try/catch
阻止的情况下被抛出,那么由于UncaughtException
答案 1 :(得分:0)
我也为fs.exist和fs.existSync获得ENOENT,这没有任何意义。奇怪的是,这是由一个未使用的变量引起的(见下文),一旦我删除了这个变量,ENOENT就会消失,不知道为什么。
var params = var params = {
input: fs.createReadStream(msgfile),
output: process.stdout,
terminal: false
}
答案 2 :(得分:-2)
在尝试打开之前尝试使用fs.existsSync()
。