为什么不建议使用fstat

时间:2016-10-26 10:33:29

标签: javascript node.js

我正在阅读stat方法here的手册,并说:

  

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

     

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

所以,我有两个问题:

  • 为什么使用错误处理程序优先于fs.stat()检查文件是否存在?

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

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

  

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

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

1 个答案:

答案 0 :(得分:4)

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

当试图打开文件时,如果文件不可访问,操作将触发错误。因此,应在此处处理此类检查。否则,有more than one reasonable way to check if a file exists

另请注意,从版本6.8.0开始,existsSync()未被禁用!请参阅discussion6.8.0 changelog。上述相同的规则适用:如果您之后不打算打开文件,则仅使用它。