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


当前回答

查看源代码,有一个同步版本的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

其他回答

另一个更新

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

从文档中:

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

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

使用fileSystem(fs)测试将触发错误对象,然后需要将其包装在try/catch语句中。节省一些精力,使用0.4.x分支中介绍的功能。

var path = require('path');

var dirs = ['one', 'two', 'three'];

dirs.map(function(dir) {
  path.exists(dir, function(exists) {
    var message = (exists) ? dir + ': is a directory' : dir + ': is not a directory';
    console.log(message);
  });
});

为那些“正确”指出它不能直接回答问题的人更新了asnwer,更多的是带来了一个替代选项。

同步解决方案:

fs.existsSync('filePath')也可以在此处查看文档。

如果路径存在,则返回true,否则返回false。

Async Promise解决方案

在异步上下文中,您可以使用await关键字编写异步版本同步方法。您可以简单地将异步回调方法转换为如下承诺:

function fileExists(path){
  return new Promise((resolve, fail) => fs.access(path, fs.constants.F_OK, 
    (err, result) => err ? fail(err) : resolve(result))
  //F_OK checks if file is visible, is default does no need to be specified.

}

async function doSomething() {
  var exists = await fileExists('filePath');
  if(exists){ 
    console.log('file exists');
  }
}

access()上的文档。

❄️ 可以使用图形fs

directory.exists // boolean

查看源代码,有一个同步版本的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