【发布时间】:2015-04-16 10:56:30
【问题描述】:
我注意到官方节点文档对fs.exists 说了一些令人吃惊的事情:
"fs.exists() 是不合时宜的,仅出于历史原因而存在。 几乎不应该有理由在您自己的代码中使用它。
特别是,在打开文件之前检查文件是否存在 让你容易受到竞争条件影响的反模式:另一个 进程可能会在调用 fs.exists() 和 fs.open()。只需打开文件并在错误时处理错误 那里。”
我理解这个建议,打开一个文件,如果它不存在则处理错误,但我不明白为什么接口被弃用而不是实现简单地改变。
谁能向我解释为什么使用像fs.exists 一样简单和合乎逻辑的 API 来检查文件的存在是如此糟糕,以至于它应该被称为反模式并从节点 API 中删除?
【问题讨论】:
-
current implementation 基本上是这样的:
function exists(file, cb){ fs.stat(file, function(err, stat){ cb(err); }); }。所以我不确定你所说的implementation simply changing是什么意思。如果你真的必须知道一个文件是否存在,为什么不直接使用fs.stat?它做同样的事情,实际上会返回更多有用的信息。 -
@loganfsmyth - 他们可以在后台更改实现以进行更有效的检查,而无需生成错误并导致性能下降。使用 fs.stat() 会产生一个错误,这在访问许多文件时会显着影响性能。我个人更喜欢将 fs.exists*() 保留在 API 中,而只是重构实现。
-
请参阅stackoverflow.com/questions/31799274/… 了解一些代码替代品,用什么代替
fs.exists()
标签: node.js