为什么不推荐使用fstat

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

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

要检查一个文件是否存在,而没有后来操作,build议使用fs.access()。

所以,我有两个问题:

  • 为什么使用error handling程序比fs.stat()更喜欢检查文件是否存在?

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

我想我已经find了第二个问题的答案:

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

所以可能fs.open()阻塞其他进程的文件,而fs.stat()fs.access()只是请求信息,其他进程仍然可以更改/删除文件。

我相信这里应该明确的是, fs.statfs.access都不推荐用于在打开文件之前检查文件的可访问性的特定情况 。 在问题中也提到,这可能会引发竞争条件。 exists()existsSync()函数由于这个原因(和其他一些与API相关的existsSync()被弃用(在版本4左右):它们经常被用于这个目的。

当试图打开文件时,如果文件不可访问,操作将会触发错误。 所以这样的检查应该在这里处理。 否则,有多种合理的方法来检查文件是否存在 。

另请注意,从版本6.8.0开始, existsSync()existsSync() ! 请参阅讨论和6.8.0更新日志 。 以上规则同样适用:只有在您不打算以后打开文件时才使用它。