如何使用node.js同步检查文件或目录是否存在?


当前回答

另一个更新

我自己需要这个问题的答案,我查阅了节点文档,似乎您不应该使用fs.exists,而是使用fs.open并使用输出的错误来检测文件是否不存在:

从文档中:

fs.exists()是一个时代错误,只因历史原因而存在。在您自己的代码中使用它几乎没有任何理由。特别是,在打开文件之前检查文件是否存在让你容易受到种族状况影响的反模式:另一种进程可能会在调用fs.exists()和fs.open()。只需打开文件并在不存在时处理错误那里

http://nodejs.org/api/fs.html#fs_fs_exists_path_callback

其他回答

这里的一些答案表示fs.exists和fs.existsSync都已弃用。根据文件,这不再是事实。现在只弃用fs.exists:

请注意,fs.exists()已弃用,但fs.existsSync()未弃用。(fs.exists()的回调参数接受以下参数与其他Node.js回调不一致。fs.existsSync()不使用回调。)

因此,您可以安全地使用fs.existsSync()同步检查文件是否存在。

查看源代码,有一个同步版本的path.exists-path.existsSync。看起来文档中没有找到它。

更新:

path.exists和path.existsSync现在已弃用。请使用fs.exists和fs.existsSync。

2016年更新:

fs.exists和fs.existsSync也已被弃用。请改用fs.stat()或fs.access()。

2019年更新:

使用fs.existsSync。它没有被弃用。https://nodejs.org/api/fs.html#fs_fs_existssync_path

很可能,如果你想知道文件是否存在,你计划在它存在的时候需要它。

function getFile(path){
    try{
        return require(path);
    }catch(e){
        return false;
    }
}

这已经得到了回答,但如果您喜欢安装模块,可以使用dtfe,它代表

文件是否存在?

const dtfe = require('dtfe');
 
dtfe('package.json');
//=> true

path模块不提供path.exists的同步版本,因此必须使用fs模块。

我能想到的最快的事情是使用fs.realpathSync,它将抛出一个必须捕获的错误,因此您需要使用try/catch创建自己的包装函数。