为什么不推荐使用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.stat
和fs.access
都不推荐用于在打开文件之前检查文件的可访问性的特定情况 。 在问题中也提到,这可能会引发竞争条件。 exists()
和existsSync()
函数由于这个原因(和其他一些与API相关的existsSync()
被弃用(在版本4左右):它们经常被用于这个目的。
当试图打开文件时,如果文件不可访问,操作将会触发错误。 所以这样的检查应该在这里处理。 否则,有多种合理的方法来检查文件是否存在 。
另请注意,从版本6.8.0开始, existsSync()
是existsSync()
! 请参阅讨论和6.8.0更新日志 。 以上规则同样适用:只有在您不打算以后打开文件时才使用它。