为什么不建议使用fstat

Max*_*kyi 6 javascript node.js

我正在阅读这里stat方法手册,它说:

在调用fs.open()之前使用fs.stat()检查文件是否存在,建议不要使用fs.readFile()或fs.writeFile().相反,用户代码应直接打开/读取/写入文件,并在文件不可用时处理引发的错误.

要检查文件是否存在而不事后对其进行操作,建议使用fs.access().

所以,我有两个问题:

  • 为什么使用错误处理程序是fs.stat()检查文件存在的首选方法?

  • 而且由于我可以fs.access()用来检查文件是否存在,是否使用error handler机制仍然是首选的方式来确保文件是打开的?

我想我找到了第二个问题的答案:

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

因此,可能fs.open()阻止文件的其他进程,而fs.stat()fs.access()简单的请求信息和其他进程仍然可以修改/删除文件.

E_n*_*ate 4

我认为这里应该明确的是,对于在打开文件之前检查文件可访问性的特定情况,不建议同时使用fs.stat和。正如问题中提到的,这可能会触发竞争条件。由于这个原因(以及其他一些与 API 相关的原因),函数和已被弃用(在版本 4 左右):它们经常被用于此目的。fs.accessexists()existsSync()

当试图打开文件时,如果文件无法访问,操作将触发错误。因此,此类检查应在此处进行。否则,有不止一种合理的方法来检查文件是否存在

另请注意,从版本 6.8.0 开始,existsSync()已不再弃用!请参阅讨论6.8.0 变更日志。上面的规则同样适用:仅当您以后不打算打开该文件时才使用它。