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


当前回答

const fs = require('fs');

检查以下功能,

if(fs.existsSync(<path_that_need_to_be_checked>)){
  // enter the code to excecute after the folder is there.
}
else{
  // Below code to create the folder, if its not there
  fs.mkdir('<folder_name>', cb function);
}

其他回答

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

文件是否存在?

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

使用当前推荐的(截至2015年)API(根据节点文档),我会这样做:

var fs = require('fs');

function fileExists(filePath)
{
    try
    {
        return fs.statSync(filePath).isFile();
    }
    catch (err)
    {
        return false;
    }
}

针对@broadband在评论中提出的EPERM问题,这提出了一个很好的观点。在很多情况下,fileExists()可能不是一个很好的方法来考虑这一点,因为fileExistes()不能真正承诺布尔返回。您可能能够确定文件是否存在,但也可能会出现权限错误。权限错误并不一定意味着该文件存在,因为您可能对包含要检查的文件的目录缺少权限。当然,在检查文件是否存在时,也有可能遇到其他错误。

因此,我上面的代码实际上是doesFileExistAndDoIHaveAccessToIt(),但您的问题可能是doesFileNotExistAndCouldICreateIt(),这将是完全不同的逻辑(需要考虑EPERM错误等)。

虽然fs.existsSync的答案直接解决了这里提出的问题,但这通常不是您想要的(您不只是想知道路径上是否存在“某物”,您可能关心存在的“某物”是文件还是目录)。

底线是,如果您正在检查文件是否存在,那么您这样做可能是因为您打算根据结果采取一些操作,并且逻辑(检查和/或后续操作)应该考虑到在该路径中找到的东西可能是文件或目录,并且在检查过程中可能会遇到EPERM或其他错误。

使用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);
  });
});

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

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

我使用下面的函数来测试文件是否存在。它还捕捉到其他例外。因此,如果存在权限问题,例如chmod ugo rwx文件名或在Windows中右键单击->财产->安全->高级->权限条目:空列表。。函数应返回异常。该文件存在,但我们无权访问它。忽略此类异常是错误的。

function fileExists(path) {

  try  {
    return fs.statSync(path).isFile();
  }
  catch (e) {

    if (e.code == 'ENOENT') { // no such file or directory. File really does not exist
      console.log("File does not exist.");
      return false;
    }

    console.log("Exception fs.statSync (" + path + "): " + e);
    throw e; // something else went wrong, we don't have rights, ...
  }
}

异常输出,nodejs错误文档,以防文件不存在:

{
  [Error: ENOENT: no such file or directory, stat 'X:\\delsdfsdf.txt']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'X:\\delsdfsdf.txt'
}

如果我们没有该文件的权限,但存在,则出现异常:

{
  [Error: EPERM: operation not permitted, stat 'X:\file.txt']
  errno: -4048,
  code: 'EPERM',
  syscall: 'stat',
  path: 'X:\\file.txt'
}