我正在阅读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()
只是请求信息,其他进程仍然可以更改/删除文件。
答案 0 :(得分:4)
我认为这里应该明确的是,在开放之前检查文件的可访问性的特定情况不推荐使用fs.stat
和fs.access
它。正如问题中提到的那样,这可能会引发竞争条件。由于这个原因,函数exists()
和existsSync()
已被弃用(版本4左右)(以及与API相关的一些其他函数):它们经常被用于此目的。
当试图打开文件时,如果文件不可访问,操作将触发错误。因此,应在此处处理此类检查。否则,有more than one reasonable way to check if a file exists。
另请注意,从版本6.8.0开始,existsSync()
未被禁用!请参阅discussion和6.8.0 changelog。上述相同的规则适用:如果您之后不打算打开文件,则仅使用它。