2

我有一个简单的过程,需要打开一个文件来读取,但如果该文件不存在,它应该简单地记录/忽略错误并继续。

我已经尝试了许多来源,但找不到明确的示例来说明如何在没有节点进程抛出未捕获异常 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);
})
4

3 回答 3

4

由于竞争条件,您不应在打开文件之前检查文件是否存在,请参阅以下fs.exists()文档摘录。

不建议在调用 fs.open()、fs.readFile() 或 fs.writeFile() 之前使用 fs.exists() 检查文件是否存在。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应该直接打开/读取/写入文件并处理文件不存在时引发的错误。

Node.jsfs.exists()文档:来源

如上所述,您应该只处理传递给fs.open()回调函数的错误。fs.open()通过参数返回一个错误err到你的回调,代码ENOENT不会导致UncaughtException随后崩溃你的进程(假设你没有在进程对象上处理这个process.on('UncaughtException', err => {}))。

在描述如何将错误传递回代码时,您可能在代码中抛出错误或使用“抛出”而不是“返回”一词。上面的示例代码不会导致UncaughtException除非err.code !== 'ENOENT'。如果err.code !== 'ENOENT'那导致在err没有包装try/catch块的情况下被抛出,那将导致您的进程由于UncaughtException

于 2018-01-12T23:22:33.177 回答
-1

我也得到了 fs.exist 和 fs.existSync 的 ENOENT,这没有任何意义。奇怪的是,这是由一个未使用的变量(见下文)引起的,一旦我删除了这个 var,ENOENT 就消失了,不知道为什么。

var params =     var params = {
    input: fs.createReadStream(msgfile),
    output: process.stdout,
    terminal: false
}
于 2018-01-13T14:11:22.957 回答
-2

fs.existsSync()在尝试打开之前尝试使用。

https://nodejs.org/api/fs.html#fs_fs_existssync_path

于 2018-01-12T22:42:56.223 回答