Why is using fstat not recommended

6
我正在阅读stat方法的手册 这里,其中写道:

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

要检查文件是否存在且不进行操作,请使用 fs.access()。

因此,我有两个问题:
  • 为什么使用错误处理程序比使用 fs.stat() 检查文件是否存在是首选方式?

  • 既然我可以使用 fs.access() 检查文件是否存在,那么使用 错误处理程序 机制是否仍然是确保打开文件的首选方式?

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

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

因此,可能 fs.open() 会阻止其他进程访问文件,而 fs.stat()fs.access() 只是请求信息,因此其他进程仍然可以更改/删除该文件。

1
有用的评论 - robertklep
@T.J.Crowder,我重新措辞了我的问题,以使我的问题更加清晰明了。 - Max Koretskyi
@robertklep,谢谢。 - Max Koretskyi
相关:在 Node.js 中同步检查文件/目录是否存在 (回答也包括异步方案) - T.J. Crowder
1
如果您使用 fs.stat/fs.access 检查文件后再打开它,则该文件可能会在此期间被删除/重命名。在这种情况下,您仍然需要处理打开错误。 - Bjarke Walling
显示剩余4条评论
1个回答

4
我认为需要澄清的是,无论是fs.stat还是fs.access都不建议用于在打开文件之前检查文件是否可访问的特定情况。正如问题中所提到的,这可能会触发竞争条件。函数exists()existsSync()因此(以及与API相关的其他原因)已被弃用(大约在版本4左右)。
在寻求打开文件时,如果文件不可访问,操作将已经触发错误。因此,应在此处处理此类检查。否则,有多种合理的方法来检查文件是否存在
还要注意的是,自版本6.8.0以来,existsSync()已取消弃用!请参见讨论6.8.0更改日志。上述相同规则适用:仅在不打算之后打开文件时使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接