fs.exists,fs.existsSync - 为什么要弃用?

时间:2015-02-16 00:12:05

标签: node.js

我注意到官方节点文档说的是关于fs.exists的一些令人吃惊的事情:

  

“fs.exists()是一种时代错误,只是出于历史原因而存在。   几乎没有理由在你自己的代码中使用它。

     

特别是,在打开文件之前检查文件是否存在是一个   让你容易受到竞争条件影响的反模式:另一种   进程可能会在调用fs.exists()和之间删除文件   fs.open()。只需打开文件并处理错误即可   有“。

我理解这个建议,打开一个文件然后处理错误,如果它不存在,但我不明白的是为什么不推荐使用该接口而不是简单地改变实现。

任何人都可以向我解释为什么检查文件的存在是否与fs.exists一样简单和逻辑的API是一件坏事,它应该被称为反模式并从节点中删除API?

7 个答案:

答案 0 :(得分:8)

不需要使用fs.stat(),因为fs.existsSync()尚未弃用。

https://nodejs.org/api/fs.html#fs_fs_existssync_path

  

<强> fs.existsSync(路径)

     

添加于:v0.1.21   路径|   fs.exists()的同步版本。如果文件存在则返回true,否则返回false。

     

请注意, fs.exists()已弃用,但fs.existsSync()不是。 (fs.exists()的回调&gt;参数接受与其他&gt; Node.js回调不一致的参数.ffsexistsSync()不使用回调。)

答案 1 :(得分:7)

我认为这是因为它是多余的。您可以尝试打开文件来检查文件是否存在。如果它不存在,它会给你ENOENT

> fs.open('foo', 'r', function(err, fd) {
    ... console.log(err, fd);
    ... 
})
undefined
> { [Error: ENOENT, open 'foo'] errno: 34, code: 'ENOENT', path: 'foo' } undefined

答案 2 :(得分:4)

因为你引用了第二段。

检查文件是否存在没有意义,因为在检查后它总是可以删除。

答案 3 :(得分:4)

被弃用,因为根据某些人的说法,这是一种反模式。即信任 exists()然后对文件执行某些操作是不安全的,因为可以在exists-call和doing-something-call之间删除该文件。

我同意上述情况。但对我来说,存在更多使用exists()。我将空的虚拟文件放在我的临时和缓存目录中。当我执行危险操作时,例如从缓存目录中删除旧文件,我会查找我的虚拟文件,以确保我没有在错误的目录中运行。即我只需要确认文件在那里。存在完全适合这个法案,但我想我会转而使用stat()代替。

答案 4 :(得分:0)

existsSync的实现是这样的(v0.10.25):

function (path) {
  try {
    nullCheck(path);
    binding.stat(pathModule._makeLong(path));
    return true;
  } catch (e) {
    return false;
  }
}

所以,如果您编写if(fs.existsSync(thepath)){}之类的程序,最好将其更改为if(fs.statSync(thepath)){}

答案 5 :(得分:0)

我正在寻找这个问题的解决方案,发现fs.exists和fs.existsSync已被弃用。这似乎在我的senario中运作良好

fs.readFile(filename, 'utf8', function(err,data){
    // the err variable substitutes for the fs.exists callback function variable
    if (!err){
        // do what you planned with the file
        console.log(data)
    }else{
        // handle the non-existence of the file
        console.log('File does not exist!');
    }
});

答案 6 :(得分:0)

您可以为此使用新安装并继续使用它:
https://github.com/imyller/node-fs-exists-nodeback

jsonObject